如何在OpenCV中使特定像素透明?

4

我使用for语句检查每个像素的亮度,并尝试在亮度超过100时使其透明。但是透明度不起作用。

请看代码,image_al [x,y]的第四个是alpha通道。我该怎么办?(如果我改变bgr的值而不是透明度,它会发生变化。)


image = cv2.imread('cat.jpg', cv2.IMREAD_COLOR)

image_al=cv2.cvtColor(image,cv2.COLOR_BGR2BGRA)
image_hsv=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
for x in range(image_al.shape[0]):
    for y in range(image_al.shape[1]):
        px=image_hsv[x,y]
        print(px)
        if px[2]>100:
            px=image_al[x,y]
            image_al[x, y]=[px[0],px[1],px[2],255] #image_al[x, y]=[b,g,r,alpha]
cv2.imshow('image2',image_al)
cv2.waitKey(0)

开发环境:PyCharm,Windows

1个回答

2
尽量避免在Python中使用for循环处理图像-它们非常慢、低效且难以阅读。Numpy和OpenCV是矢量化的-它们使用优化的C语言处理整个图像并且速度快。
因此,您可以将图像转换为HSV并提取V通道,然后简单地对其进行阈值处理,并将其合并为alpha层:
import cv2
import numpy as np

# Load Image
im = cv2.imread('temple.jpg')

# Convert to HSV and take V channel
V = cv2.cvtColor(im,cv2.COLOR_BGR2HSV)[...,2]

# Threshold V channel at 100 to make alpha channel (A)
_, A = cv2.threshold(V,100,255,cv2.THRESH_BINARY)

# Stack A channel onto RGB channels
result = np.dstack((im,A))

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

enter image description here

照片由CEphoto,Uwe Aranas拍摄或者 © CEphoto,Uwe Aranas CC BY-SA 3.0

结果

enter image description here

如果您想让明亮的像素透明,请更改为以下内容:
_, A = cv2.threshold(V,100,255,cv2.THRESH_BINARY_INV) 

那么结果将是:

enter image description here

关键词:Python,图像处理,HSV,色调、饱和度和亮度,添加Alpha通道,合并Alpha通道,创建Alpha通道,OpenCV。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接