我用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
答案 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)
Photo,作者:CEphoto,Uwe Aranas,或者©CEphoto,Uwe Aranas CC BY-SA 3.0
结果
如果要使明亮的像素透明,请更改为:
_, A = cv2.threshold(V,100,255,cv2.THRESH_BINARY_INV)
那么结果将是:
关键字:Python,图像处理,HSV,色相饱和度和值,添加Alpha通道,合并Alpha通道,创建Alpha通道,OpenCV