【问题标题】:TypeError: 'int' object is not subscriptable?TypeError:'int'对象不可下标?
【发布时间】:2023-04-02 22:14:01
【问题描述】:

当我运行我的 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

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

【问题讨论】:

标签: python opencv


【解决方案1】:

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

  • JPEG 图像是有损保存的,因此您的数据通常不会以您写入的相同值被读回 - 这似乎让每个人都感到震惊。他们对图像进行阈值处理,使所有高于 127 的值都变为白色,而其他值变为黑色并具有真正的二进制图像,然后他们将保存为 JPEG 并惊讶地发现,在重新加载时,尽管已对图像进行了阈值处理,但它仍然具有 78 种颜色。

  • JPEG 图像有各种各样的伪像——大块的噪点会扰乱你的处理——尤其是当你看到饱和度时。

  • PNG 图像通常是调色板,其中每个像素将索引存储到 256 色调色板中,而不是 RGB 三元组。大多数操作在调色图像上都会失败,因为您将索引与 RGB 颜色三元组进行比较。

  • PNG 图像通常是灰度图像 - 因此只有一个通道,并且与 RGB 三元组的比较会失败,因为通道数不同。

因此,在回答您的问题时,我怀疑您的 PNG 图像是调色板(尤其是当它只有 2 种颜色时)。因此,您需要在打开时将其转换为 RGB 或亮度模式:

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

【讨论】:

    猜你喜欢
    • 2017-07-15
    • 2012-02-21
    • 2018-08-07
    • 2017-11-10
    • 2023-03-20
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多