You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:27:04