TypeError:“ int”对象不可下标吗?

时间:2018-09-26 00:51:29

标签: python opencv

当我运行我的PIL代码时,出现此错误:

from PIL import Image,ImageDraw, ImageColor, ImageChops

# Load images
im1 = Image.open('im1.png')
im2 = Image.open('im2.png')


# Flood fill white edges of image 2 with black
seed  = (0, 0)
black = ImageColor.getrgb("black")
ImageDraw.floodfill(im2, seed, black, thresh=127)

# Now select lighter pixel of image1 and image2 at each pixel location and 
result = ImageChops.lighter(im1, im2)
result.save('result.png')

错误在于我的图像处理:

Traceback (most recent call last):
File "C:\Users\Martin 
Ma\Desktop\test\36\light_3_global\close_open\gray\main.py", line 96, in <module>
ImageDraw.floodfill(im2, seed, black, thresh=127)
File "E:\python\lib\site-packages\PIL\ImageDraw.py", line 346, in floodfill
if _color_diff(value, background) <= thresh:
File "E:\python\lib\site-packages\PIL\ImageDraw.py", line 386, in _color_diff
return abs(rgb1[0]-rgb2[0]) +  abs(rgb1[1]-rgb2[1]) +  abs(rgb1[2]-rgb2[2])
TypeError: 'int' object is not subscriptable

enter link description here

我该如何解决?非常感谢!

1 个答案:

答案 0 :(得分:1)

您已更改图像类型而未考虑后果。 JPEG和PNG是根本不同的野兽,您需要意识到这一点:

  • JPEG图像被有损保存,因此通常不会以与您写入的相同值来回读您的数据-这似乎使所有人震惊。他们对图像进行阈值处理,以使所有高于127的值都变为白色,而其他值变为黑色,并获得真实的二进制图像,然后将它们另存为JPEG,并且感到惊讶的是,即使重新设置阈值,图像仍具有78种颜色。 / li>

  • JPEG图像具有各种伪像-块状的噪点会干扰您的处理-尤其是当您查看饱和度时。

  • PNG图像经常被灰化,其中每个像素将索引存储到256色调色板中,而不是RGB三元组中。大多数操作将对已着色的图像失败,因为您正在将索引与RGB颜色三元组进行比较。

  • PNG图像通常是灰度的-因此只有一个通道,并且由于通道数量不同,与RGB三胞胎的比较将失败。

因此,在回答您的问题时,我怀疑您的PNG图像已灰化(尤其是只有两种颜色时,很有可能)。因此,您需要在打开时将其转换为RGB或亮度模式:

im1 = Image.open('im1.png').convert('RGB')