numpy按[0,0,0]整像素掩码使用copyto/putmask复制RGB矩阵
NumPy高性能实现RGB矩阵全零透明像素过滤复制
需求说明
- 处理对象:存储RGB像素值的矩阵,矩阵中每个元素为长度3的数组,分别对应单个像素的R、G、B三通道数值
- 复制规则:将源矩阵内容复制到目标矩阵时,仅过滤值为
[0,0,0]的全零像素(这类像素视为透明层,不覆盖目标矩阵对应位置内容);非全零像素必须完整复制全部三个通道的值,不得因为单个通道值为0就跳过该通道的复制 - 性能要求:实现方案需满足连续图片流处理的高性能要求,禁止使用列表遍历等逐元素循环的低性能实现
错误实现及问题分析
以下两种常见写法均无法满足需求:
# 错误写法1 np.putmask(dst_slice, src_slice != 0, src_slice) # 错误写法2 np.copyto(dst_slice, src_slice, where=src_slice != 0)
上述写法的判断逻辑是逐单个元素校验零值,会错误修改非全零像素内的0通道值。例如像素[0,0,12]内的两个0通道会被判定为无需复制,最终该像素的通道值被错误篡改,无法实现仅跳过全零[0,0,0]像素的效果。
正确实现方案
使用NumPy向量化操作实现整像素级判断,无循环开销,性能满足高吞吐图片流处理要求,代码如下:
np.copyto(dst_slice, src_slice, where=np.any(src_slice, axis=2, keepdims=True))
逻辑说明
np.any(src_slice, axis=2, keepdims=True)沿通道维度(第三维度,axis=2)判断每个像素是否存在非零通道值:仅当单个像素的三个通道值全为0时返回False,其余像素均返回Truekeepdims=True保证生成的掩码维度与源、目标矩阵维度完全对齐,复制时会对判定为需要复制的像素,完整写入三个通道的全部数值,不会出现单通道被错误过滤的问题
内容的提问来源于stack exchange,提问作者benoit courant
相关产品推荐
相关产品推荐

