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

在C#的Emgu.CV中如何为Mat使用自定义颜色映射?

实现Emgu CV自定义颜色映射的方法

CvInvoke.ApplyColorMap仅支持内置的ColorMapType枚举值,要实现自定义颜色映射,最高效的方式是**构建自定义查找表(LUT)**并结合CvInvoke.Lut方法,以下是具体实现:

方法一:使用查找表(LUT)批量处理(推荐)

这种方式利用OpenCV的批量处理能力,比逐像素遍历效率高很多:

  1. 构建自定义颜色查找表
    创建一个256行1列的3通道8位Mat,每个行对应灰度值0-255的BGR颜色(Emgu CV默认通道顺序为BGR):

    // 初始化256个颜色的查找表,对应灰度值0~255
    Mat colorLut = new Mat(256, 1, DepthType.Cv8U, 3);
    for (int i = 0; i < 256; i++)
    {
        // 自定义颜色逻辑示例:从红色(灰度0)渐变到绿色(灰度255)
        byte blue = 0;
        byte green = (byte)i;
        byte red = (byte)(255 - i);
        // 将颜色写入查找表对应行
        colorLut.SetTo(new Bgr(blue, green, red).MCvScalar, new Range(i, i + 1));
    }
    
  2. 应用查找表到灰度图

    // srcMat为你的50×50单通道8位灰度图
    Mat dstMat = new Mat();
    CvInvoke.Lut(srcMat, colorLut, dstMat);
    

方法二:逐像素遍历(适合理解原理)

如果需要更灵活的像素级控制,可以手动遍历每个灰度像素并映射颜色:

Mat dstMat = new Mat(srcMat.Size, DepthType.Cv8U, 3);
for (int y = 0; y < srcMat.Rows; y++)
{
    for (int x = 0; x < srcMat.Cols; x++)
    {
        // 获取当前像素的灰度值
        byte gray = srcMat.GetData(y, x)[0];
        // 自定义颜色映射逻辑
        byte blue = (byte)(gray * 0.6);
        byte green = (byte)(255 - gray * 0.8);
        byte red = (byte)(gray);
        // 将BGR颜色写入目标图对应像素
        dstMat.SetData(y, x, new byte[] { blue, green, red });
    }
}

注意事项

  • 注意Emgu CV彩色Mat的通道顺序是BGR,而非RGB,设置颜色时顺序错误会导致颜色显示异常。
  • 查找表的尺寸必须是256×1的3通道8位Mat,对应灰度值0到255的完整范围。
  • 可根据需求修改颜色映射逻辑,比如分段设置不同颜色区间、添加非线性渐变等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:06:42