Я полагаю, вы получаете сообщение об ошибке типа TypeError: 'PixelAccess' object is not iterable
...?
См. Image.load документацию о том, как получить доступ к пикселям ..
По сути, чтобы получить список пикселей на изображении, используйте PIL
:
from PIL import Image
i = Image.open("myfile.png")
pixels = i.load() # this is not a list, nor is it list()'able
width, height = i.size
all_pixels = []
for x in range(width):
for y in range(height):
cpixel = pixels[x, y]
all_pixels.append(cpixel)
Это добавляет каждый пиксель к all_pixels
- если файл является изображением RGB (даже если он содержит только черно-белое изображение), это будет кортеж, например:
(255, 255, 255)
Чтобы преобразовать изображение в монохромное, вы просто усредняете три значения - так, последние три строки кода станут ..
cpixel = pixels[x, y]
bw_value = int(round(sum(cpixel) / float(len(cpixel))))
# the above could probably be bw_value = sum(cpixel)/len(cpixel)
all_pixels.append(bw_value)
Или, чтобы получить яркость (средневзвешенное значение):
cpixel = pixels[x, y]
luma = (0.3 * cpixel[0]) + (0.59 * cpixel[1]) + (0.11 * cpixel[2])
all_pixels.append(luma)
Или чистый 1-битный черно-белый вид:
cpixel = pixels[x, y]
if round(sum(cpixel)) / float(len(cpixel)) > 127:
all_pixels.append(255)
else:
all_pixels.append(0)
Возможно, в PIL есть методы, позволяющие сделать такие преобразования RGB -> BW
быстрее, но это работает и не особенно медленно.
Если вы хотите выполнять вычисления только для каждой строки, вы можете пропустить добавление всех пикселей в промежуточный список. Например, для вычисления среднего значения каждой строки:
from PIL import Image
i = Image.open("myfile.png")
pixels = i.load() # this is not a list
width, height = i.size
row_averages = []
for y in range(height):
cur_row_ttl = 0
for x in range(width):
cur_pixel = pixels[x, y]
cur_pixel_mono = sum(cur_pixel) / len(cur_pixel)
cur_row_ttl += cur_pixel_mono
cur_row_avg = cur_row_ttl / width
row_averages.append(cur_row_avg)
print "Brighest row:",
print max(row_averages)