首页 > 解决方案 > 根据其他图像将图像的特定通道设置为某个值

问题描述

我有这张有 4 个通道的图像。我想要做的是,减少这张图片的不透明度。我希望图像保持透明,但是,我只想降低大众徽标部分的不透明度。(使用 opencv/numpy 和 python)

这是我尝试过的:

logo = cv2.imread(FILE_PATH, cv2.IMREAD_UNCHANGED)
logo[:, :, 3] = 50

但这会将值 50 分配给整个图像,给我这个结果。请注意图像的其余部分不再透明(我希望它保持与原始图像相同。)

我想到了类似的东西:

#This is my logic NOT ANY CODE, I want to do something like this:

if (any of) other 3 channels are non zero, make alpha channel of that pixel = 50.
else, keep that pixel as it is. (This pixel would be part of logo)

有没有办法通过在 python 中使用 opencv / numpy 来实现这个结果?我的最后一个选择是遍历所有像素并寻找上述条件,但我觉得这样效率低下。

这个答案正是我不想要的。我只想将徽标部分(彩色像素)的 alpha 通道设置为 50。

标签: pythonimagenumpyopencv

解决方案


只是充实@yann-ziselman的评论......

在此处输入图像描述

这是并排的图像的 RGBA 通道,带有红色边框,因此您可以在 Stack Overflow 的背景上看到范围:

在此处输入图像描述

以下是如何按照您的要求进行操作:

import cv2

# Load image including alpha channel
im = cv2.imread('logo.png', cv2.IMREAD_UNCHANGED)

# Set alpha channel to 50 anywhere none of the BGR channels is non-zero
im[(im[..., :3]!=0).any(2), 3] = 50

# Save result
cv2.imwrite('result.png', im)

结果

在此处输入图像描述

结果并排拆分为 RGBA 通道

在此处输入图像描述


推荐阅读