如何在opencv中使某些像素透明?

时间:2019-12-22 08:57:00

标签: python opencv

我用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 个答案:

答案 0 :(得分: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

Photo,作者: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