我有一个rgba格式的图像,其中有(0,0,0)黑色,我想将这些(0,0,0)像素中的每一个都隐蔽为透明。该图像已经有一个Alpha通道,我不知道如何激活一个像素的Alpha通道。我尝试将Alpha通道值设置为0,但到目前为止尚未奏效:
for y in range(len(blur)):
for x in range(len(blur[0])):
if blur[y][x][0] == 0 and blur[y][x][1] == 0 and blur[y][x][2] == 0:
blur[y][x][3] = 0
此外,如何使用numpy来优化此嵌套for循环?
它可能只是显示问题,但是很难从您的代码示例中分辨出来。
cv2.imshow
不支持透明度。将结果存储到PNG图像文件中,然后使用显示透明度的查看器查看图像。 (使用GIMP
或paint.net
,可以轻松查看透明像素)。
下面的代码示例执行以下操作:
这里是代码:
import cv2 import numpy as np # Read image in BGR format img = cv2.imread('chelsea.png') # Write cat in in black color cv2.putText(img, 'cat', (img.shape[1]//2-85*len('cat'), img.shape[0]//2+100), cv2.FONT_HERSHEY_DUPLEX, 10, (0, 0, 0), 20) # Coinvert from BGR to BGRA bgra = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA) # Slice of alpha channel alpha = bgra[:, :, 3] # Use logical indexing to set alpha channel to 0 where BGR=0 alpha[np.all(bgra[:, :, 0:3] == (0, 0, 0), 2)] = 0 # Save bgra to PNG file cv2.imwrite('bgra.png', bgra) # Show image for testing cv2.imshow('img', img) cv2.imshow('bgra', bgra) # The letters are black, because cv2.imshow does not support transparency. cv2.imshow('bgra[:,:,3]', bgra[:,:,3]) cv2.waitKey(0) cv2.destroyAllWindows()
结果:
站点背景为白色,因此透明像素为白色...