我有两个相似的具有透明背景的蒙版图像。 我想获得图像差异,并希望它与图像相似时一样低。
但是结果表明,在看起来完全相同的巨大透明区域中存在差异。 (白色表示差异)
diff_res = ImageChops.difference(lenna1, lenna2).convert('RGB')
我在某些网站上检查了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 {3}}
现在我知道convert()将透明区域默认设置为黑色。但是我还是不明白。
* i还使用.putalpha()
以相同的alpha级别进行了测试感谢您阅读此问题。
答案 0 :(得分:2)
两个图像都具有透明性,只是一个图像具有透明的白色像素,另一个图像具有透明的黑色像素。说同一件事的另一种方式是,透明像素的基本颜色在一个图像中为黑色,而在另一图像中为白色。您看不到差异,因为它们是透明的!
这里是lenna1
,左侧的alpha层已删除,右侧的alpha层本身已删除:
这是lenna2
,左侧的alpha层已删除,右侧的alpha层本身已删除:
您可以通过找到所有透明像素并使它们变为白色来使它们相同:
# 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中的示例:
白色:
绿色:
面具:
magick compare -metric rmse -read-mask hat_mask.png hat_white.png hat_green.png hat_diff.png
0 (0)
差异将在下面显示为红色。
如果我使用您的图片:
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
如果我们比较整个图像,包括透明区域下的区域,则
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.