我假设您会得到类似.. 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)
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)
9条答案
按热度按时间ozxc1zmp1#
当你调用getdata()时Python应该不会崩溃。映像可能已经损坏或者你的PIL安装有问题。用另一个映像试试或者发布你正在使用的映像。
这将按照您想要的方式分解图像:
czfnxgou2#
如果您安装了numpy,可以尝试:
(我在这里说“尝试”,是因为不清楚为什么
getdata()
不适合您,也不知道asarray
是否使用getdata,但值得一试。)cigdeys33#
我假设您会得到类似..
TypeError: 'PixelAccess' object is not iterable
的错误...?有关如何访问像素,请参见Image.load文档。
基本上,要获取图像中的像素列表,请使用
PIL
:这会将每个像素附加到
all_pixels
-如果文件是RGB图像(即使它只包含白色图像),这些将是一个元组,例如:要将图像转换为单色,只需将这三个值取平均值-因此,最后三行代码将变为..
或者要获得亮度(加权平均值):
或纯1位白色图像:
PIL中可能有一些方法可以更快地完成这样的
RGB -> BW
转换,但这是可行的,而且不是特别慢。如果只想对每行执行计算,则可以跳过将所有像素添加到中间列表的步骤。例如,要计算每行的平均值:
cuxqih214#
或者如果你想计算白色或黑色像素
这也是一个解决方案:
jexiocij5#
输出是图片中所有RGB值的列表:
wqlqzqxt6#
不是PIL,但
scipy.misc.imread
可能仍然很有趣:给予
所以它是(高度,宽度,通道)。所以你可以通过
i34xakig7#
注意:在PIL中,img为RGBA。在cv2中,img为BGRA。
我的强大解决方案:
ldfqzlk88#
正如我上面所评论的,问题似乎是从PIL内部列表格式到标准python列表类型的转换。我发现Image.tostring()要快得多,并且根据您的需要,它可能已经足够了。在我的情况下,我需要计算图像数据的CRC32摘要,它非常适合。
如果需要执行更复杂的计算,那么可能需要包含numpy的tom10响应。
to94eoyn9#
看起来PILlow可能已经将
tostring()
更改为tobytes()
。当尝试提取RGBA像素以将其放入OpenGL纹理时,以下代码对我很有效(在glTexImage2D
调用中,为了简洁起见,我省略了该调用)。