11

I have converted my image into a csv file and it's like a matrix but I want it to be a single row. How can I convert all of the images in dataset into a csv file (each image into one line).

Here's the code I've used:

from PIL import Image
import numpy as np
import os, os.path, time

format='.jpg'
myDir = "Lotus1"
def createFileList(myDir, format='.jpg'):
    fileList = []
    print(myDir)
    for root, dirs, files in os.walk(myDir, topdown=False):
            for name in files:
               if name.endswith(format):
                  fullName = os.path.join(root, name)
                  fileList.append(fullName)
                  return fileList

fileList = createFileList(myDir)
fileFormat='.jpg'
for fileFormat in fileList:
 format = '.jpg'
 # get original image parameters...
 width, height = fileList.size
 format = fileList.format
 mode = fileList.mode
 # Make image Greyscale
 img_grey = fileList.convert('L')
 # Save Greyscale values
 value = np.asarray(fileList.getdata(),dtype=np.float64).reshape((fileList.size[1],fileList.size[0]))
 np.savetxt("img_pixels.csv", value, delimiter=',')

input : http://uupload.ir/files/pto0_lotus1_1.jpg

output:http://uupload.ir/files/huwh_output.png

1
  • write into a new file, onto a single line the content of your matrix ? Commented Mar 2, 2018 at 13:39

5 Answers 5

20

From your question, I think you want to know about numpy.flatten(). You want to add

value = value.flatten()

right before your np.savetxt call. It will flatten the array to only one dimension and it should then print out as a single line.

The rest of your question is unclear bit it implies you have a directory full of jpeg images and you want a way to read through them all. So first, get a file list:

def createFileList(myDir, format='.jpg'):
fileList = []
print(myDir)
for root, dirs, files in os.walk(myDir, topdown=False):
    for name in files:
        if name.endswith(format):
            fullName = os.path.join(root, name)
            fileList.append(fullName)
return fileList

The surround your code with a for fileName in fileList:

Edited to add complete example Note that I've used csv writer and changed your float64 to ints (which should be ok as pixel data is 0-255

from PIL import Image
import numpy as np
import sys
import os
import csv

#Useful function
def createFileList(myDir, format='.jpg'):
fileList = []
print(myDir)
for root, dirs, files in os.walk(myDir, topdown=False):
    for name in files:
        if name.endswith(format):
            fullName = os.path.join(root, name)
            fileList.append(fullName)
return fileList

# load the original image
myFileList = createFileList('path/to/directory/')

for file in myFileList:
    print(file)
    img_file = Image.open(file)
    # img_file.show()

    # get original image parameters...
    width, height = img_file.size
    format = img_file.format
    mode = img_file.mode

    # Make image Greyscale
    img_grey = img_file.convert('L')
    #img_grey.save('result.png')
    #img_grey.show()

    # Save Greyscale values
    value = np.asarray(img_grey.getdata(), dtype=np.int).reshape((img_grey.size[1], img_grey.size[0]))
    value = value.flatten()
    print(value)
    with open("img_pixels.csv", 'a') as f:
        writer = csv.writer(f)
        writer.writerow(value)
Sign up to request clarification or add additional context in comments.

16 Comments

Hi @Pam, I have 285 images and I want to convert it to a csv file, and I want to have each image to be one row of csv file. In a nutsell I want to convert the images to feature vector for other tasks.
My answer should give you all the code you need. I've assumed all your images have the same height and width, though. If not, you might want to add "width, height" on the start of each line in the csv file.
Dear @Pam, I dont have much experience in python. I've edited my code. Is it possible for you to check my code again?
@Zeinab How will you know the images' dimensions if they're saved as one-dimensional arrays though? you'd need to add some kind of header.
This isn't a good idea - you want to remove black pixels with no way of putting them back in? The images would be completely destroyed. How big are your images? The clever thing to do would be to resize them. The number of columns is (width x height), from that, you can work out how small your images need to be.
|
6

How about you convert your images to 2D numpy arrays and then write them as txt files with .csv extensions and , as delimiters?

Maybe you could use a code like following:

np.savetxt('np.csv', image, delimiter=',')

Comments

6
import numpy as np
import cv2
import os

IMG_DIR = '/home/kushal/Documents/opencv_tutorials/image_reading/dataset'

for img in os.listdir(IMG_DIR):
        img_array = cv2.imread(os.path.join(IMG_DIR,img), cv2.IMREAD_GRAYSCALE)

        img_array = (img_array.flatten())

        img_array  = img_array.reshape(-1, 1).T

        print(img_array)

        with open('output.csv', 'ab') as f:

            np.savetxt(f, img_array, delimiter=",")

1 Comment

is img_array = img_array.reshape(-1, 1).T the same as img_array = img_array.reshape(1, -1) ?
3
import os
import pandas as pd

path = 'path-to-the-folder'
os.chdir(path)
lists = os.listdir(path)
labels = []
file_lst = []

for folder in lists:
    files = os.listdir(path +"/"+folder)
    for file in files:
      path_file = path + "/" + folder + "/" + file
      file_lst.append(path_file)
      labels.append(folder)

dictP_n = {"path": file_lst,
           "label_name": labels,
          "label": labels}   

data  = pd.DataFrame(dictP_n, index = None)
data = data.sample(frac=1)
data['label'] = data['label'].replace({"class1": 0, "class2": 1 })
data.to_csv("path-to-save-location//file_name.csv", index =None)

Comments

-1
from logging import root

from PIL import Image
import numpy as np
import sys
import os
import csv

def createfilelist(myDir, format='.jpg'):
    fileList= []
    print(myDir)
    for roots,dirs,files in os.walk(myDir,topdown=False):
        for name in files:
            if name.endswith(format):
                fullname = os.path.join(myDir,name)
                fileList.append(fullname)

    return fileList

myFileList = createfilelist('C:/Users/Rahul/Desktop/CASIA2/Au')

for file in myFileList:
    print(file)
    img_file = Image.open(file)
    width, height = img_file.size
    format = img_file.format
    mode = img_file.mode
    img_grey  = img_file.convert('L')

    value = np.asarray(img_grey.getdata(), dtype=np.int).reshape((img_grey.size[1], img_grey.size[0]))
    value = value.flatten()
    print(value)

    with open("image_to_csv.csv", 'a') as f:
        writer = csv.writer(f)
        writer.writerow(value)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.