当我运行我的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
我该如何解决?非常感谢!
答案 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')