我有两个文件夹,其中充满了不同大小的图像(每个图像约2000个文件)。我需要所有28x28格式的文件。之后,我需要将每个文件夹的所有图像转换为一个csv文件。有什么想法可以做到吗?我绝对是python的初学者,所以如果我需要更多时间来了解基本知识,请耐心等待。
我尝试了在这里找到的解决方案:Converting images to csv file in python
特别是:
import numpy as np
import cv2
import os
IMG_DIR = 'C:/Users/Anwender/Documents/Uni/KI/Trainingsdaten/Train'
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('train.csv', 'ab') as f:
np.savetxt(f, img_array, delimiter=",")`
我希望将img_array = img_array.reshape(-1,1).T
更改为img_array = img_array.reshape(-1,28*28).T
可以得到描述的结果,但可以提供:“ ValueError:无法将大小为2500的数组重新成形为形状(784)”。我知道两个数字没有共同的分母,所以没有余数的除法是不可能的。
答案 0 :(得分:0)
在转换为CSV之前,使用PIL调整图像大小。
import numpy as np
from PIL import Image
import cv2
import os
IMG_DIR = 'C:/Users/Anwender/Documents/Uni/KI/Trainingsdaten/Train'
for img in os.listdir(IMG_DIR):
img_array = cv2.imread(os.path.join(IMG_DIR,img), cv2.IMREAD_GRAYSCALE)
img_pil = Image.fromarray(img_array)
img_28x28 = np.array(img_pil.resize((28, 28), Image.ANTIALIAS))
img_array = (img_28x28.flatten())
img_array = img_array.reshape(-1,1).T
print(img_array)
with open('train.csv', 'ab') as f:
np.savetxt(f, img_array, delimiter=",")
答案 1 :(得分:0)
您可以使用cv2.resize()
将每个图像的尺寸调整为28X28
。
尝试以下代码:
for img in os.listdir(IMG_DIR):
img_array = cv2.imread(os.path.join(IMG_DIR,img), cv2.IMREAD_GRAYSCALE)
resized_image = cv2.resize(img_array, (28, 28))
img_flatten = resized_image.reshape(-1)
#print(img_flatten)
with open('train1.csv', 'ab') as f:
np.savetxt(f, img_flatten, delimiter=",")
在data.reshape
函数中,-1
用作占位符,用于确定给定的尺寸。您也可以使用resized_image.flatten()
代替img_flatten = resized_image.reshape(-1)
将numpy数组展平为一维。
在这种情况下,每个图像都将以numpy形状(784,)数组形式保存到csv
文件中。将img_flatten.reshape(-1, 1).T
添加到上述代码后,会将其形状转换为(1, 784)
。保存方式完全取决于您。