Как оцифровать изображения дата-сета в Pandas DataFrame?
Имеется: папка с цветными картинками одинакового размера (256x256), всего таких картинок 115. Необходимо создать Pandas DataFrame, в котором были бы все оцифрованные картинки. Вот пример (как я представляю) датафрейма Pandas с одной картинкой размером 2х2:
pandasDataframe([(0, 0, 0), (255, 255, 255), (255, 255, 255), (0, 0, 0)])
Здесь создан список для этой одной картинки, а каждый кортеж представляет собой RGB-значение пикселя. И по итогу этот Pandas DataFrame должен будет передаваться методу fit модели классификации.
Проблема: для оцифровки я использую такую функцию:
def digitize_dataset_images():
for file in listdir(DATASET_IMAGES_DIRECTORY): # Идём по всем картинкам в папке
filename, extension = splitext(file)
try:
if extension == ".png":
# Открываем картинку с помощью PIL
im = Image.open(DATASET_IMAGES_DIRECTORY + "\\" + filename + extension)
# Проходимся по каждому пикселю и заносим (пока его в dataframe)
for pixel in iter(im.getdata()):
print(pixel) # здесь пока нету добавления пикселя в dataframe, просто пример
except OSError:
print("Cannot digitize %s" % file)
Дело в том, что помимо того, что данный код выполняется неимоверно долго на моем ПК, но он еще и возвращает странные значения, а именно что-то по типу этого (дело не в нулях, а в том, что кортежи содержат четыре значения, что не сходится с RGB-значением, да и всё равно не понятно, зачем здесь такие кортежи):
((0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0) ...)
Комментарий: помогите, пожалуйста, оцифровать мои картинки так, чтобы я смог избежать проблем, описанных выше (то-есть, чтобы полученный оцифрованный dataframe был годен для скармливания модели классификации. Тип модели я пока не определил, но пусть это будет KNN)
Ответы (1 шт):
могу подсказать по скорости - сам с этим сталкивался: сначала (в цикле) данные rgb закинуть в список, а уж потом весь список одной командой загнать в датафрейм. Операция займет секунды.
Почему 4 значения вместо трёх: не знаю... я обычно картинку закидываю в пиксельную матрицу pix = image.load() и потом пробегаю двойным циклом ...
pix[i,j][0] - красный
pix[i,j][1] - зеленый
pix[i,j][2] - синий