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

C#图像处理中如何实现彩色阈值分割?

C#指定颜色保留二值化实现方案

你需求的操作标准名称为颜色范围掩码过滤(Color Range Masking),之前搜索不到结果大概率是关键词匹配问题,以下是两种可行的高性能实现方案:

方案1:原生C#自实现(可控性最高,无第三方依赖)

完全基于.NET内置的System.Drawing类库实现,性能可以满足每秒数十张1080P图片的处理需求:

  • 避免使用GetPixel/SetPixel方法读写像素,这两个方法性能极低,改用LockBits将位图数据一次性锁存到内存中直接操作字节数组,处理完成后再用UnlockBits写回
  • 颜色判断优先转换为HSV色彩空间,相比RGB空间对光照、压缩导致的颜色偏差容忍度更高,比如保留红色只需限定H分量在0-10、170-180区间,再结合S、V分量的阈值过滤即可
  • 核心逻辑示例:
// 锁存位图数据
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = Math.Abs(bmpData.Stride) * bmp.Height;
byte[] rgbValues = new byte[bytes];
Marshal.Copy(ptr, rgbValues, 0, bytes);

// 遍历像素过滤
for (int i = 0; i < rgbValues.Length; i += 3) // 24位RGB格式步长为3
{
    byte b = rgbValues[i], g = rgbValues[i+1], r = rgbValues[i+2];
    // 此处替换为你自己的颜色判断逻辑,符合条件保留,不符合设为黑色
    if (!IsTargetColor(r,g,b))
    {
        rgbValues[i] = 0; rgbValues[i+1] = 0; rgbValues[i+2] = 0;
    }
    // 也可直接将符合条件的像素设为白色,进一步简化后续模板匹配
}

// 写回位图
Marshal.Copy(rgbValues, 0, ptr, bytes);
bmp.UnlockBits(bmpData);

方案2:基于Emgu CV实现(开发量最小,性能最优)

Emgu CV是OpenCV的C#封装,底层为C++实现,性能远高于托管代码,且内置你后续需要的模板匹配能力:

  • 直接调用CvInvoke.InRange方法,传入目标颜色的上下阈值,一行代码即可生成你需要的二值掩码图像
  • 后续模板匹配可直接调用CvInvoke.MatchTemplate方法,支持多种匹配算法,无需自行实现

额外性能优化建议

  • 固定分辨率的处理场景可提前预分配字节缓冲区,避免每次处理重复申请释放内存
  • 可使用Parallel.For对像素遍历逻辑做并行化处理,充分利用多核CPU性能,处理速度可随核心数线性提升
  • 无需保留目标区域原色的话,处理后直接输出8位单通道二值图,后续模板匹配速度相比32位彩色图可提升3倍以上

内容的提问来源于stack exchange,提问作者user2677466

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:45:03