【问题标题】:Converting Transparent Image to Black background changes colors将透明图像转换为黑色背景会改变颜色
【发布时间】:2021-10-20 10:24:48
【问题描述】:

我有this 带有透明背景的图像。我想将透明背景转换为纯黑色。我不想更改徽标中任何像素的颜色。

我为此使用以下代码:

image = Image.open(IMG_PATH)
new_image = Image.new("RGBA", image.size, "BLACK") # Create a white rgba background
new_image.paste(image, (0, 0), image)              # Paste the image on the background. 
new_image.convert('RGB').save(SAVE_PATH, "PNG")  # Save as PNG

但结果看起来像This 图像。虽然我的背景是黑色而不是透明,但如果你注意到,标志颜色现在有点暗淡。为什么会这样?如何防止这种情况?我希望我的图像与原始图像的颜色相同,但背景应该是黑色。我也愿意使用任何其他库,例如 Opencv。

更新:

Photoshop 生成的结果:Image

以上代码生成的结果:Image

上面两张图片有明显的区别。

【问题讨论】:

  • 原始标志是否部分透明?这也可能只是一种视错觉吗? en.wikipedia.org/wiki/Checker_shadow_illusion
  • 我不知道您所说的“部分透明”到底是什么意思,但是除了“adidas”和 3 个梯形之外的所有部分都是透明的。最初我也认为这是一种错觉,但后来当我尝试在 Photoshop 中做同样的事情时,我得到了不同的结果。请查看更新后的帖子。
  • 图像(白色部分)部分透明。在控制台中进行快速测试并将背景颜色更改为红色会使徽标变为粉红色。

标签: python image opencv image-processing python-imaging-library


【解决方案1】:

使用 OpenCV 为透明区域填充颜色:

import sys
import cv2
import numpy as np

dir = sys.path[0]
im = cv2.imread(dir+'/im.png', -1)
im[np.where(im[:, :, 3] == 0)] = (0, 0, 0, 255)
cv2.imwrite(dir+'/im_.png', im)

测试用例:

填充任何不完全透明的地方:

im[np.where(im[:, :, 3] != 0)] = (0, 0, 0, 255)

在任何透明或有 alpha 的地方填写:

im[np.where(im[:, :, 3] != 0|255)] = (0, 0, 0, 255)

在没有 alpha 通道的地方填充:

im[np.where(im[:, :, 3] == 0|255)] = (0, 0, 0, 255)

【讨论】:

    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2011-02-12
    相关资源
    最近更新 更多