为什么PIL convert('RGB')可以将某些透明变成黑色,而有些却变成白色?

时间:2019-05-03 15:37:42

标签: python image-processing png python-imaging-library photoshop

我有两个相似的具有透明背景的蒙版图像。 我想获得图像差异,并希望它与图像相似时一样低。

lenna1.png lenna2.png

但是结果表明,在看起来完全相同的巨大透明区域中存在差异。 (白色表示差异)

diff_res = ImageChops.difference(lenna1, lenna2).convert('RGB')

diff_res

我在某些网站上检查了lenna1,lenna2的图像差异,结果显示图像相同,只是边界上的差异很小。

然后我怀疑alpha通道值,并将lenna1,lenna2转换为“ RGB”。 并且将一个人的背景显示为黑色,而另一个人的背景显示为白色。

lenna1 = Image.open('lenna1.png')
lenna2 = Image.open('lenna2.png')

converted_lenna1 = lenna1.convert('RGB')
converted_lenna2 = lenna2.convert('RGB')

converted_lenna1

现在我知道convert()将透明区域默认设置为黑色。但是我还是不明白。

  1. 为什么透明区域之间存在图像差异?
  2. 为什么一些透明图像变成白色,我如何制作自己的“将是白色”透明图像?

* i还使用.putalpha()

以相同的alpha级别进行了测试

感谢您阅读此问题。

2 个答案:

答案 0 :(得分:2)

两个图像都具有透明性,只是一个图像具有透明的白色像素,另一个图像具有透明的黑色像素。说同一件事的另一种方式是,透明像素的基本颜色在一个图像中为黑色,而在另一图像中为白色。您看不到差异,因为它们是透明的!

这里是lenna1,左侧的alpha层已删除,右侧的alpha层本身已删除:

enter image description here

这是lenna2,左侧的alpha层已删除,右侧的alpha层本身已删除:

enter image description here

您可以通过找到所有透明像素并使它们变为白色来使它们相同:

# Load the image and make into Numpy array
rgba = np.array(Image.open('lena2.png'))

# Make image transparent white anywhere it is transparent
rgba[rgba[...,-1]==0] = [255,255,255,0]

# Make back into PIL Image and save
Image.fromarray(rgba).save('result.png')

如果要将透明像素设置为蓝色,以便可以查看它们进行测试,请使用:

rgba[rgba[...,-1]==0] = [0,0,255,255]

如果已安装 ImageMagick ,则可以在终端中强制所有透明像素变为您选择的颜色,例如洋红色。

magick lenna1.png -background magenta -alpha background result.png

这通常意味着您可以通过将所有透明像素设为黑色来改善PNG压缩并减小PNG文件大小,因此,与透明像素的颜色完全不同时相比,图像的压缩效果可能要好得多:

magick image.png -background black -alpha background result.png

答案 1 :(得分:2)

在Imagemagick 7中,您可以进行蒙版比较以忽略图像区域。 (Python Wand 0.5.3支持Imagemagick 7,尽管我还不知道它是否支持屏蔽比较)。这是命令行Imagemagick 7中的示例:

白色:

enter image description here

绿色:

enter image description here

面具:

enter image description here

magick compare -metric rmse -read-mask hat_mask.png hat_white.png hat_green.png hat_diff.png

0 (0)


差异将在下面显示为红色。

enter image description here

如果我使用您的图片:

magick image1.png -alpha extract mask.png
magick compare -metric rmse -read-mask mask.png image1.png image2.png -alpha deactivate diff.png

or

magick compare -metric rmse  \( image1.png -alpha extract -write mpr:mask +delete \) -read-mask mpr:mask image1.png image2.png -alpha deactivate diff.png


7179.85 (0.109557) <--- ~11% different in opaque area


enter image description here

如果我们比较整个图像,包括透明区域下的区域,则

magick compare -metric rmse image1.png image2.png -alpha off null:
59598.7 (0.909419) <--- ~91% different over the whole area

如果我们包含Alpha通道,则由于包含了两个相同的Alpha通道,这会降低比较指标,这会产生误导,并且得出:

magick compare -metric rmse image1.png image2.png null:

or

magick compare -metric rmse -channel rgba image1.png image2.png null:

2828.15 (0.0431548) <--- ~4.3% different.