在C#的Emgu.CV中如何为Mat使用自定义颜色映射?
实现Emgu CV自定义颜色映射的方法
CvInvoke.ApplyColorMap仅支持内置的ColorMapType枚举值,要实现自定义颜色映射,最高效的方式是**构建自定义查找表(LUT)**并结合CvInvoke.Lut方法,以下是具体实现:
方法一:使用查找表(LUT)批量处理(推荐)
这种方式利用OpenCV的批量处理能力,比逐像素遍历效率高很多:
构建自定义颜色查找表
创建一个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)); }应用查找表到灰度图
// 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
相关产品推荐
相关产品推荐

