Python中如何为uint16图像添加透明度(OpenCV连通组件场景)
问题根因与解决方法
核心问题点
- 你当前用于alpha通道的
maskg只有0和1两个取值:uint16格式的alpha通道规则为0代表完全透明,65535代表完全不透明,1的透明度几乎接近全透明,合并后目标区域几乎是透明的,你抠图时置为0的黑色背景就会透出来,看起来就像背景还是黑色。 - 你之前尝试将掩码乘255/65535后颜色异常,是因为你同时用这个缩放后的掩码去乘原图做抠图:uint16的像素最大值为65535,原图像素乘255/65535会直接触发数值溢出,导致颜色错乱。你之前乘255无效的原因也很简单,255在uint16的alpha通道里仅相当于8位下1的透明度,依然接近全透明,自然看不到效果。
修正方案
你只需要拆分两个不同用途的掩码即可,互不影响:
# img 为原始uint16 3通道图像 # bin 为原始uint8二值掩码 cc = cv2.connectedComponentsWithStats(bin, connectivity, cv2.CV_32S) num_labels = cc[0] labels = cc[1] for i in range(1, num_labels): # 生成0/1的uint16掩码,仅用于抠图,不会触发溢出 mask_crop = (labels == i).astype(np.uint16) # 抠取目标区域,背景置0 glyph = img * mask_crop[..., np.newaxis] # 生成0/65535的uint16掩码,仅用于alpha通道,符合透明规则 mask_alpha = (mask_crop * 65535).astype(np.uint16) # 转换为4通道图像并赋值alpha glyphBGRA = cv2.cvtColor(glyph, cv2.COLOR_BGR2BGRA) glyphBGRA[:, :, 3] = mask_alpha # 直接保存为tiff即可,OpenCV原生支持uint16 4通道tiff写入 cv2.imwrite(f"glyph_{i}.tiff", glyphBGRA)
验证说明
保存后的文件在Photoshop打开后如果没有直接显示透明,可在图层面板双击背景层转为普通层,即可看到正常的透明背景效果,也可在通道面板查看第4个alpha通道,确认是纯黑+纯白的二值通道即可。
内容的提问来源于stack exchange,提问作者sb000
相关产品推荐
相关产品推荐

