在 Python 中使用 Opencv 降低图像的不透明度

Ank*_*Ank 1 python opencv image-processing opacity

在下面给出的程序中,我将 alpha 通道添加到 3 通道图像以控制其不透明度。但是无论我给的 alpha 通道的值是多少,对图像都没有影响!任何人都可以解释我为什么?

import numpy as np
import cv2

image = cv2.imread('image.jpg')
print image

b_channel,g_channel,r_channel = cv2.split(image)
a_channel = np.ones(b_channel.shape, dtype=b_channel.dtype)*10
image = cv2.merge((b_channel,g_channel,r_channel,a_channel))

print image
cv2.imshow('img',image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

我可以在终端中看到添加了 alpha 通道并且它的值随着我在程序中的更改而变化,但对图像本身的不透明度没有影响!

我是 OpenCV 的新手,所以我可能会遗漏一些简单的东西。感谢帮助!

BHa*_*awk 5

Alpha 是用于控制图像不透明度的通道。除非您对其执行操作,否则 Alpha 通道通常不会执行任何操作。它本身不会使图像透明。

Alpha 通常用于移除图像中不重要的区域或将一个图像与另一个图像组合。在第一种情况下,图像通常只是简单地乘以它的 alpha。这有时称为预乘。在这种情况下,Alpha 通道的暗区使 RGB 变暗,而亮区则保持 RGB 不变。

R = R*A 
G = G*A 
B = B*A
Run Code Online (Sandbox Code Playgroud)

这是您的代码版本,可以满足您的需求(注意 - 我转换为 32 位,因为当 alpha 通道的范围从 0 到 1 时更容易使用):

import numpy as np
import cv2

i = cv2.imread('image.jpg')
img = np.array(i, dtype=np.float)
img /= 255.0
cv2.imshow('img',img)
cv2.waitKey(0)

#pre-multiplication
a_channel = np.ones(img.shape, dtype=np.float)/2.0
image = img*a_channel

cv2.imshow('img',image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

第二种情况用于尝试将图像覆盖在另一个图像上。这是一种合成操作,通常称为“过度”合并或“混合”合并。在这种情况下,有前景图像“A”和背景图像“B”以及可以包含在 RGB 图像中或单独包含的 alpha 通道。在这种情况下,您可以使用以下方法将 A 放在 B 上:

output = (A * alpha) + (B * (1-alpha))
Run Code Online (Sandbox Code Playgroud)