Изменение размеров изображений разных размеров в 28x28 изображений и преобразование их в один CSV-файл - PullRequest
0 голосов
/ 08 июля 2019

У меня есть две папки, заполненные изображениями (около 2000 файлов каждая) разных размеров.Мне нужны все они в формате 28x28.После этого мне нужно конвертировать все эти изображения из каждой папки в один CSV-файл.Есть идеи, как я мог это сделать?Я абсолютный новичок в Python, поэтому, пожалуйста, будьте немного терпеливы, если мне нужно больше времени, чтобы понять основы.

Я попробовал решение, которое нашел здесь: Преобразование изображений в CSV-файл в 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 голосов
/ 08 июля 2019

Вы можете использовать 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), чтобы сгладить массив пустышек в одном измерении.

В этом случае каждое изображение будет сохранено в файл csv в виде массива фигуры (784,).При добавлении img_flatten.reshape(-1, 1).T в приведенный выше код преобразует его форму в (1, 784).Это зависит только от вас, как вы хотите сохранить.

0 голосов
/ 08 июля 2019

Используйте PIL для изменения размера изображения перед преобразованием в CSV.

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=",")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...