python - 为什么 PIL convert ('RGB' ) 使一些透明变成黑色而另一些变成白色?

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

我有两个具有透明背景的相似蒙版图像。 我想要获得图像差异并期望它的值(value)与图像相似一样低。

lenna1.png lenna2.png

但结果显示透明区域的巨大差异看起来是一样的。
(白色表示差异)

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

diff_res

我在一些网站上检查了 lenna1、lenna2 图像差异,它说图像除了边界上的小差异外都是一样的。

然后我怀疑 alpha channel 值并将 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 converted_lenna2

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

  1. 透明区域为什么会出现图像差异?
  2. 为什么一些透明图像变成了白色,我怎样才能制作自己的“将是白色”的透明图像?

*我还使用 .putalpha() 测试了相同的 alpha 级别

感谢您阅读这个问题。

最佳答案

两张图片都有透明度,只是一张的白色像素透明,另一张的黑色像素透明。换句话说,透明像素的底层颜色在一个图像中是黑色,在另一个图像中是白色。您看不出区别,因为它们是透明的!

这里是 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

关于python - 为什么 PIL convert ('RGB' ) 使一些透明变成黑色而另一些变成白色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55973083/

相关文章:

c++ - 使用 libvlc smem 从视频中获取帧并将其转换为 opencv Mat。 (c++)

java - 如何使用缩略图调整图像大小时将黑色背景替换为白色?

imagemagick 调整大小和质量 PNG

javascript - 为许多图像优化 Konva.js

python - 基于数据框过滤数据透视表

python - 在字符串中的特定模式内进行替换 |正则表达式

opencv - 无法在 opencv c++ 中使用 Stitcher 类拼接许多图像

python - OpenCV 是否具有多目标跟踪功能?

python - 为什么只读属性是可写的?

python - 如何防止 Qt 按钮出现在单独的框架中?