如何使用OpenCV.js实现图像皮肤模糊,复现Python掩码赋值功能逻辑
方案1:使用OpenCV.js原生copyTo方法(最优解)
你Python中的out[global_mask>0] = blur[global_mask>0]逻辑,在OpenCV.js中可以直接通过copyTo的掩码重载实现,仅需一行代码即可得到完全一致的效果,无需额外处理透明、图层覆盖等逻辑:
// 前置要求:out、blur、global_mask三个Mat尺寸完全一致,global_mask为单通道灰度图(CV_8UC1类型) blur.copyTo(out, global_mask);
执行后out中掩码为白色的皮肤区域会自动被blur的对应像素覆盖,其余区域保持原始图像内容不变。
方案2:手动遍历像素实现(适合需要自定义逻辑的场景)
如果你需要自行控制像素赋值逻辑,可以直接读取三个图像的像素数组遍历处理:
const width = out.cols; const height = out.rows; // 读取三个图像的像素数据 const outPixels = out.data; const blurPixels = blur.data; const maskPixels = global_mask.data; // 单通道掩码每个像素占1位,RGB/RGBA图像每个像素分别占3/4位 // 以下示例按RGBA四通道处理,三通道场景可把步长改为3、去掉A通道赋值即可 const channelStep = 4; for (let i = 0; i < height * width; i++) { if (maskPixels[i] > 0) { const pixelPos = i * channelStep; outPixels[pixelPos] = blurPixels[pixelPos]; // R通道 outPixels[pixelPos + 1] = blurPixels[pixelPos + 1]; // G通道 outPixels[pixelPos + 2] = blurPixels[pixelPos + 2]; // B通道 outPixels[pixelPos + 3] = blurPixels[pixelPos + 3]; // A通道 } }
注意事项
- 使用前需确认
out、blur、global_mask三个Mat的宽高完全匹配 global_mask必须是单通道8位灰度图,皮肤区域值为255、非皮肤区域值为0- 手动遍历的执行效率远低于原生
copyTo方法,非特殊场景优先使用原生API
内容的提问来源于stack exchange,提问作者Nabeel Ahmed
相关产品推荐
相关产品推荐

