Как извлечь один канал RGB из нескольких изображений Python - PullRequest
1 голос
/ 09 мая 2019

Я новичок в Python.Я хочу извлечь значения RGB из нескольких изображений.Я хочу использовать значения RGB каждого изображения в качестве входных данных для перекрестной проверки K-Fold.

Я могу получить значения RGB только для одного изображения.Поэтому я попытался получить несколько изображений с помощью следующего кода:

from __future__ import with_statement
from PIL import Image
import glob

#Path to file 
for img in glob.glob({Path}+"*.jpg"):
    im = Image.open(img) 

#Load the pixel info
pix = im.load()

#Get a tuple of the x and y dimensions of the image
width, height = im.size

#Open a file to write the pixel data
with open('output_file.csv', 'w+') as f:
  f.write('R,G,B\n')

  #Read the details of each pixel and write them to the file
  for x in range(width):
    for y in range(height):
      r = pix[x,y][0]
      g = pix[x,x][1]
      b = pix[x,x][2]
      f.write('{0},{1},{2}\n'.format(r,g,b))

Я ожидаю получить такой же ввод в CSV-файле:

img_name,R,G,B
1.jpg,50,50,50
2.jpg,60,60,70

Но фактический вывод - файл CSVсодержать 40000+ строк.

Можно ли автоматизировать значение RGB из нескольких изображений?

1 Ответ

2 голосов
/ 09 мая 2019

Ваш код в настоящее время записывает значение каждого пикселя в виде отдельной строки в вашем CSV-файле, поэтому у вас может быть огромное количество строк.

Чтобы работать с несколькими файлами, вам нужно переставитьнемного кода и отступ для записи файла в вашем цикле.Также может быть хорошей идеей использовать CSV-библиотеку Python для записи CSV-файла на тот случай, если любое из ваших имен файлов содержит запятые.Если бы это произошло, это бы правильно обернуло поле в кавычки.

from PIL import Image
import glob
import os
import csv

#Open a file to write the pixel data
with open('output_file.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow(["img_name", "R", "G", "B"])

    #Path to file 
    for filename in glob.glob("*.jpg"):
        im = Image.open(filename) 
        img_name = os.path.basename(filename)

        #Load the pixel info
        pix = im.load()

        #Get a tuple of the x and y dimensions of the image
        width, height = im.size

        print(f'{filename}, Width {width}, Height {height}') # show progress

        #Read the details of each pixel and write them to the file
        for x in range(width):
            for y in range(height):
                r = pix[x,y][0]
                g = pix[x,y][1]
                b = pix[x,y][2]
                csv_output.writerow([img_name, r, g, b])

Примечание: также была проблема с получением значений r g b, у вас было [x,x] в двухслучаи.


Как отмечает @GiacomoCatenazzi, ваши петли также могут быть удалены:

from itertools import product
from PIL import Image
import glob
import os
import csv

#Open a file to write the pixel data
with open('output_file.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow(["img_name", "R", "G", "B"])

    #Path to file 
    for filename in glob.glob("*.jpg"):
        im = Image.open(filename) 
        img_name = os.path.basename(filename)

        #Load the pixel info
        pix = im.load()

        #Get a tuple of the x and y dimensions of the image
        width, height = im.size

        print(f'{filename}, Width {width}, Height {height}') # show 

        #Read the details of each pixel and write them to the file
        csv_output.writerows([img_name, *pix[x,y]] for x, y in product(range(width), range(height)))
...