将不同大小的图像调整为28x28图像大小并将其转换为一个csv文件

时间:2019-07-08 11:15:03

标签: python numpy opencv

我有两个文件夹,其中充满了不同大小的图像(每个图像约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)”。我知道两个数字没有共同的分母,所以没有余数的除法是不可能的。

2 个答案:

答案 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)。保存方式完全取决于您。