Python 如何循环所有图像像素并判断它们是黑色还是白色

Python 如何循环所有图像像素并判断它们是黑色还是白色,python,python-imaging-library,Python,Python Imaging Library,我有一个简单的黑白gif图像(比如说400x400px) 我需要从图像中获取所有像素,并确定它们是黑色还是白色。我需要创建一个包含像素及其颜色信息的字典 我对python还很陌生,所以我正在努力解决这个问题。但到目前为止,我的剧本是这样的: #!/usr/bin/env python import os import Image os.chdir("D:/python-projects") aImage = Image.open("input.gif") aPixelsBlackOrWhi

我有一个简单的黑白gif图像(比如说400x400px)

我需要从图像中获取所有像素,并确定它们是黑色还是白色。我需要创建一个包含像素及其颜色信息的字典

我对python还很陌生,所以我正在努力解决这个问题。但到目前为止,我的剧本是这样的:

#!/usr/bin/env python

import os
import Image

os.chdir("D:/python-projects")
aImage = Image.open("input.gif")

aPixelsBlackOrWhiteDictionary = {}
# now I need to fill the dictionary with values such as
# "X,Y": 0
# "X,Y": 1
# where X,Y are coordinates and 0/1 i the pixel color (b/w)
基本上,我希望最终的字典是这样的:

"0,0" : 0 # pixel with X=0,Y=0 coordinates is black
"1,0" : 1 # pixel with X=1,Y=0 coordinates is White
编辑:

当我尝试时:

print aImage[0, 0]
我得到一个错误:

Traceback (most recent call last):
  File "D:\python-projects\backprop.py", line 15, in <module>
    print aImage[0, 0]
  File "C:\Python26\lib\site-packages\pil-1.1.7-py2.6-win32.egg\Image.py", line
512, in __getattr__
    raise AttributeError(name)
AttributeError: __getitem__
回溯(最近一次呼叫最后一次):
文件“D:\python projects\backprop.py”,第15行,在
打印目标[0,0]
文件“C:\Python26\lib\site packages\pil-1.1.7-py2.6-win32.egg\Image.py”,第行
512,在__
提升属性错误(名称)
AttributeError:\uu getitem__
试试:

还请注意,可以使用元组作为字典键,也可以使用mydict[(x,y)]而不是mydict[“x,y”]

此像素信息已存储在图像中,为什么要将其存储在dict中?

确实要这样做吗?如果使用字典来存储这些数据,效率会非常低


我认为numpy数组更合适…

您应该使用
getpixel
而不是使用索引操作符。请注意,这可能非常缓慢。您最好使用
getdata
,它以序列形式返回所有像素


如果您想查看拇指是否为单声道,可以尝试以下方法:-

def is_mono(image, variance=5):
    img_dta = list(im.getdata())   
    colour_test = lambda r,g,b : abs(r-g) > variance or abs(g-b) > variance
    if any([colour_test(r,g,b) for (r,g,b) in img_dta]):  return False
    return True

url1 = 'http://farm5.static.flickr.com/4145/5090947066_0d9d45edf4_s.jpg' # Mono
url2 = 'http://farm5.static.flickr.com/4087/5090362043_03c2da75d4_s.jpg' # Colour
for url in (url1, url2):
    dta = urllib.urlopen(url).read()
    im = Image.open(StringIO(dta))
    print is_mono(im)
>


如果您可以确保图像处于黑白模式,您可以执行以下操作:

aPixelsBlackOrWhiteDictionary = {}
for y in range(0,aImage.size[1]):
    for x in range(0,aImage.size[0]):
        aPixelsBlackOrWhiteDictionary[ (x,y) ] = aImage.getpixel( (x,y) )
这将使用其他答案中提到的
getpixel
,字典的键将是元组
(x,y)


验证
getpixel
是否返回1和0

这只是一个小图像(400x400像素),因此我认为这无关紧要。但是一旦我得到了需要的一切,我可能会重构代码,这样会更有效。@Richard:你使用的是旧版本的PIL吗?说这在PIL 1.1.6中有效@Richard:fixed。使用此方法访问要比getpixel和putpixel快得多。@Brian:编辑之前的示例代码中有一个错误。除非使用
load
,否则不能以这种方式使用索引。参考保罗的答案,并对其进行评论。你想要的词典已经存在了。。作为
aImage
struct。只需执行
aImage.getpixexl((0,0))==(255255255)
。我认为这个信息不正确。通过Image.open()返回的对象进行访问比getpixel和putpixel快得多。@Paulo:我的观点是他应该使用
getpixel
,因为索引不会用他的代码编译,而不是说他一般应该使用
getpixel
。正如我的帖子所说,
getpixel
速度很慢。然而,我认为从效率的角度来看,
getdata
和索引可能同样合适。
True
False
aPixelsBlackOrWhiteDictionary = {}
for y in range(0,aImage.size[1]):
    for x in range(0,aImage.size[0]):
        aPixelsBlackOrWhiteDictionary[ (x,y) ] = aImage.getpixel( (x,y) )
print aPixelsBlackOrWhiteDictionary
{(0, 1): 1, (1, 2): 1, (3, 2): 0, (0, 0): 0, (3, 3): 1, (3, 0): 0, (3, 1): 1, (2, 1): 0, (0, 2): 0, (2, 0): 1, (1, 3): 0, (2, 3): 0, (2, 2): 1, (1, 0): 1, (0, 3): 1, (1, 1): 0}