如何使用Python逐像素分析图像

3

我已经编写了代码,应该允许我浏览每个列的y值,并返回每个像素的RBG值。我试图找到图像中所有纯白色的像素。但是出现了错误:"IndexError:image index out of range",当第一列的最后一个值被找到时。我该如何继续下一列?

我的代码如下:

from PIL import Image

pix = newimage2.load()
print(newimage2.size)
print(" ")

whitevalues = 0
x = 0
while x <= newimage2.width:
    y = 0
    while y <= newimage2.height:
        print(pix[x,y])
        if pix[x,y] == (255,255,255):
            whitevalues = whitevalues + 1
        y = y+1
    x = x+1
print(whitevalues)
5个回答

3

Python是从0开始计数的,也就是说如果你有一个列表(list),比如:

l = [1, 4, 7, 3, 6]

如果你想用 while循环(虽然使用for循环更好)来遍历一个列表,那么你需要在索引小于列表长度的情况下进行循环。因此,索引实际上永远不会等于列表长度,只会小于等于列表长度-1

遍历上述列表的代码如下:

i = 0
while i < len(l):
   print(l[i])
   i += 1

这将会给你以下输出结果

1
4
7
3
6

同样的逻辑也适用于您的图像 - 它本质上只是一个二维列表。
这意味着您需要将代码中的“小于或等于”(<=)比较器更正为“小于”(<)。然后您的代码应该按照您想要的方式运行。
因此,以下是已更正的代码:
from PIL import Image
pix = newimage2.load()
print(newimage2.size)
print(" ")
whitevalues = 0
x = 0
while x < newimage2.width:
    y = 0
    while y < newimage2.height:
        print(pix[x,y])
        if pix[x,y] == (255,255,255):
            whitevalues += 1
        y += 1
    x += 1

print(whitevalues)

然而,正如我在开头提到的那样,使用for循环更适合此应用程序,因为它需要更少的代码行并且更符合Python的风格。因此,以下是for循环的代码,您可能会发现它很有用:

from PIL import Image
pix = newimage2.load()
print(newimage2.size)
print(" ")
whitevalues = 0
for row in newimage2:
    for col in row:
        print(col)
        if col == (255,255,255):
            whitevalues += 1

print(whitevalues)

或者,如果你想要极度符合 Python 风格,你可以使用 list-comprehension 来完成这个操作:

whitevalues = sum([1 for r in pix for c in r if c == 1])

1

你只需要在两个while循环中将'<='更改为'<'。

主要原因是索引从0开始。因此,如果您查看图像大小,它将为(100,100),但是如果尝试访问像素pix [100,100],则不存在。

但是pix [99,99]存在,并对应于pix [100,100]。

干杯,


1
使用零索引,最后一个索引比大小小1。因此,您需要将<=更改为<。此外,此问题应该有一个index标签。
有几种内置函数可以执行此任务。请参见此问题以获取示例。这些解决方案很可能会显着提高速度。如何在Python中计算ndarray中某个项的出现次数?

1

尝试以下代码,而不是使用while循环:

[width, height] = newimage2.size 
for x in range(width):
    for y in range(height):
        cpixel = pixels[x, y]
        if(cpixel ==(255,255,255):
            whitevalues = whitevalues + 1

这将确保索引在范围内。

1
其他答案已经解释了你的代码为什么不起作用,这里只是展示另一种计算白色像素的方法:
from PIL import Image

image_path = '/path/to/image'
image = Image.open(image_path)
count = 0

# image.getdata() returns all the pixels in the image
for pixel in image.getdata():
    if pixel == (255, 255, 255):
        count += 1

print(count)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接