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

ju竹

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

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')

convert_lenna1   convert_lenna2

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

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

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

感谢您阅读此问题。

马克·谢切尔

两幅图像都具有透明性,只是一个图像中的白色像素变为透明,而另一个像素中的黑色像素变为透明。换句话说,透明像素的基本颜色在一个图像中是黑色,而在另一图像中是白色。您看不到差异,因为它们是透明的!

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么有些行可以插入而有些行不能?

来自分类Dev

将RGB阵列转换为PIL图像

来自分类Dev

为什么我的图像会变成方形 PIL?

来自分类Dev

为什么 PIL.ImageColor.getcolor() 只返回白色或黑色?

来自分类Dev

为什么某些内置javascript方法是静态的而有些则不是呢?

来自分类Dev

为什么有些非root程序可以双击执行而有些则不能?

来自分类Dev

为什么有些引用类型的变量可以绑定右值而有些不能呢?

来自分类Dev

为什么渲染变成黑色

来自分类Dev

PIL图像打开会将白色像素变成黑色像素

来自分类Dev

PIL image.convert(“ RGB”)会将图像转换为sRGB还是AdobeRGB?

来自分类Dev

为什么有些原语有字节码,而有些则没有?

来自分类Dev

如何使用scikit-image和/或PIL将ProPhoto RGB色彩空间转换为RGB?

来自分类Dev

使用PIL进行RGB处理-如何拍摄单个图像并生成具有不同RGB值的图像?

来自分类Dev

为什么有些终端从终端运行时使用“&”关闭了某些程序,而有些终端却没有呢?

来自分类Dev

为什么有些 Angular 模块会导入而有些却不会?

来自分类Dev

为什么有些库需要嵌入而有些则不需要?

来自分类Dev

为什么有些函数参数存储在堆栈上而有些存储在堆上?

来自分类Dev

为什么有些快照很快,而有些快照那么慢?

来自分类Dev

为什么有些文本在WPF中会消失,而有些则不会

来自分类Python

将RGB转换为黑色或白色

来自分类Dev

为什么将colorsys包中的rgb转换为hsl时rgb值中的r不正确

来自分类Dev

为什么某些注释行受到尊重而有些注释却被忽略并给出错误

来自分类Dev

为什么列表结构中的某些功能需要“列表”前缀,而有些则不需要?

来自分类Dev

使用PIL将RGB转换为灰度的不同像素值

来自分类Python

使用PIL将RGBA PNG转换为RGB

来自分类Python

使用PIL将RGBA PNG转换为RGB

来自分类Dev

如何使用PIL将图像从HSV转换为RGB?

来自分类Dev

将RGB图像转换为黑白PIL手识别

来自分类Dev

Node.js:为什么纯黑色 (#000000) 被检测为 RGB 4、4、4?

Related 相关文章

  1. 1

    为什么有些行可以插入而有些行不能?

  2. 2

    将RGB阵列转换为PIL图像

  3. 3

    为什么我的图像会变成方形 PIL?

  4. 4

    为什么 PIL.ImageColor.getcolor() 只返回白色或黑色?

  5. 5

    为什么某些内置javascript方法是静态的而有些则不是呢?

  6. 6

    为什么有些非root程序可以双击执行而有些则不能?

  7. 7

    为什么有些引用类型的变量可以绑定右值而有些不能呢?

  8. 8

    为什么渲染变成黑色

  9. 9

    PIL图像打开会将白色像素变成黑色像素

  10. 10

    PIL image.convert(“ RGB”)会将图像转换为sRGB还是AdobeRGB?

  11. 11

    为什么有些原语有字节码,而有些则没有?

  12. 12

    如何使用scikit-image和/或PIL将ProPhoto RGB色彩空间转换为RGB?

  13. 13

    使用PIL进行RGB处理-如何拍摄单个图像并生成具有不同RGB值的图像?

  14. 14

    为什么有些终端从终端运行时使用“&”关闭了某些程序,而有些终端却没有呢?

  15. 15

    为什么有些 Angular 模块会导入而有些却不会?

  16. 16

    为什么有些库需要嵌入而有些则不需要?

  17. 17

    为什么有些函数参数存储在堆栈上而有些存储在堆上?

  18. 18

    为什么有些快照很快,而有些快照那么慢?

  19. 19

    为什么有些文本在WPF中会消失,而有些则不会

  20. 20

    将RGB转换为黑色或白色

  21. 21

    为什么将colorsys包中的rgb转换为hsl时rgb值中的r不正确

  22. 22

    为什么某些注释行受到尊重而有些注释却被忽略并给出错误

  23. 23

    为什么列表结构中的某些功能需要“列表”前缀,而有些则不需要?

  24. 24

    使用PIL将RGB转换为灰度的不同像素值

  25. 25

    使用PIL将RGBA PNG转换为RGB

  26. 26

    使用PIL将RGBA PNG转换为RGB

  27. 27

    如何使用PIL将图像从HSV转换为RGB?

  28. 28

    将RGB图像转换为黑白PIL手识别

  29. 29

    Node.js:为什么纯黑色 (#000000) 被检测为 RGB 4、4、4?

热门标签

归档