opencv 如何在考虑透明度的情况下有效且正确地覆盖PNG?

5gfr0r5j  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(178)

当我试图将一个图像覆盖在另一个图像上时,一个图像有一个透明的圆角矩形填充,而另一个只是一个正常的图像,它看起来要么像这个

(只是把黄色覆盖在粉红色上,而根本没有考虑到圆角),要么像这个

(看起来就像圆角矩形,没有添加任何东西,甚至保持透明度)
它应该是这样:

以下是两个示例图像:(粉红色. png)

和(黄色. png)

下面是用于此操作的代码:
第一个
您可以通过按键盘上的键来测试不同的字母组合

ubby3x7f

ubby3x7f1#

看起来你把整个图像设置成了一个遮罩,这就是为什么圆角在粉红色背景下一点效果都没有的原因。我自己也在这个任务中挣扎了很久,最后用了枕头而不是OpenCV。我不知道它是否更有性能,但我让它运行了。
下面是适用于您的示例的代码:

from PIL import Image

# load images
background = Image.open(r"pink.png")
# load image and scale it to the same size as the background
foreground = Image.open(r"yellow.png").resize(background.size)
# split gives you the r, g, b and alpha channel of the image.
# For the mask we only need alpha channel, indexed at 3
mask = background.split()[3]

# we combine the two images and provide the mask that is applied to the foreground.
im = Image.composite(background, foreground, mask)
im.show()

如果您的背景不是示例中的单色,并且您希望使用粘贴原始图像的版本,则必须创建一个与背景大小相同的空图像,然后将前景粘贴到位置(您的gridpos),例如:

canvas = Image.new('RGBA', background.size)
canvas.paste(foreground, gridpos)
foreground = canvas

希望这对你有帮助!

相关问题