【Emgu.CV教程】第24篇 、色彩处理之LUT()查找表转换颜色

2024-01-05 09:04

本文主要是介绍【Emgu.CV教程】第24篇 、色彩处理之LUT()查找表转换颜色,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        LUT (Look-Up Table)查找表转换,是对原始图像的像素数值进行快速转换,以实现图像的像素压缩目的。LUT()函数的官方定义如下:

public static void LUT(IInputArray src,  // 输入图像IInputArray lut, // 查找表IOutputArray dst, // 输出图像
)

        根据网上的各位大神,结合我的理解,LUT()实现像素压缩的原理是:以颜色深度为Cv8U的单通道灰度图来说,图像中像素数值只能在[0,255]区间内分布。如果我定义一个256个长度的一维数组LUT[256]原始图像映射到目标图像的方法是:

  • 像素值为0 的点,用LUT[0]代替;
  • 像素值为1 的点,用LUT[1]代替;
  • 像素值为2 的点,用LUT[2]代替;
  • ...
  • 像素值为254 的点,用LUT[254]代替;
  • 像素值为255 的点,用LUT[255]代替;

        LUT[256]数组的值,是由用户自己定义的,如果LUT[0] = 255,LUT[1] = 255 ,其余全是0,你看看,是不是把图像压缩成只有255和0了。其中原始图像的像素值是0和1的,转换成255,剩余全部转换成0,这么说简单吧。

1、图像压缩

        举个例子,原始图像是这个均匀分布的灰度图:

        如果我想压缩像素值,让目标图像的值只输出0、35、70、105、140、175、210、245,也就是原始图像在0到34之间,变成0;35到69之间,变成35;70到104之间,变成70;105到139之间变成105;140到174之间变成140;175到209之间变成175;210到244之间变成210;245及以上变成245,代码如下:

Mat tempMat = srcMat.Clone(); // 深拷贝
CvInvoke.CvtColor(tempMat, tempMat, ColorConversion.Bgr2Gray);
Matrix<byte> matrixLUT = new Matrix<byte>(1, 256, 1);
for (int n = 0; n < 256; n++)
{matrixLUT.Data[0, n] = (byte)(n / 35 * 35);
}Mat dstMat = new Mat(tempMat.Rows, tempMat.Cols, DepthType.Cv8U, 1);
CvInvoke.LUT(tempMat, matrixLUT, dstMat);
CvInvoke.Imshow("Gray Mat, " + tempMat.Size.ToString(), tempMat);
CvInvoke.Imshow("LUT process Mat, " + dstMat.Size.ToString(), dstMat);

        标准的灰度图和LUT()函数压缩后的图像如下所示,效果很明显吧:

2、颜色取反

        之前的文章也讲过颜色取反,其实LUT()函数也可以,但是不常用,代码如下:

Mat dstMat = srcMat.Clone(); // 深拷贝
Mat tempMat = srcMat.Clone(); // 深拷贝
Matrix<byte> matrixLUT = new Matrix<byte>(1, 256, 1);
for (int n = 0; n < 256; n++)
{matrixLUT.Data[0, n] = (byte)(255 - n);
}dstMat = new Mat(tempMat.Rows, tempMat.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 3);// tempMat为原始图像
CvInvoke.LUT(tempMat, matrixLUT, dstMat);
CvInvoke.Imshow("LUT process Mat, " + dstMat.Size.ToString(), dstMat);

        效果用户自己试一试。注意哈:

  • 查找表必须是Matrix<byte>格式的。
  • 压缩效果就看用户自己定义,颜色取反,就是255减去原始像素值。
  • 目标图像,必须是和原始图像大小、颜色深度、通道数完全相同。

3、彩色图像压缩

        上面两个例子是对灰度的图操作,查找表参数matrixLUT定义方法如下:

Matrix<byte> matrixLUT = new Matrix<byte>(1, 256, 1);

        如果是直接操作三通道的彩色图像,查找表参数matrixLUT就需要这样定义了:

Matrix<byte> matrixLUT = new Matrix<byte>(1, 256, 3);

        假如Blue通道值压缩为0、22、44、66... 220、242,Green通道值压缩为0、50、100、150、200、250,Red通道值压缩为9、129、249,代码如下:

Mat tempMat = srcMat.Clone(); // 深拷贝
Matrix<byte> matrixLUT = new Matrix<byte>(1, 256, 3);
for (int n = 0; n < 256; n++)
{matrixLUT.Data[0, n * 3] = (byte)(n / 22 * 22);matrixLUT.Data[0, (n * 3) + 1] = (byte)(n / 50 * 50);if (n <= 100){matrixLUT.Data[0, (n * 3) + 2] = 9;}if (n > 100 && n <= 200){matrixLUT.Data[0, (n * 3) + 2] = 129;}if (n > 200){matrixLUT.Data[0, (n * 3) + 2] = 249;}
}Mat dstMat = new Mat(tempMat.Rows, tempMat.Cols, DepthType.Cv8U, 3);
CvInvoke.LUT(tempMat, matrixLUT, dstMat);
CvInvoke.Imshow("LUT process Mat, " + dstMat.Size.ToString(), dstMat);

        原始图像和压缩后的图像,对比如下:

        原本图像是均匀过渡的,LUT压缩后,颜色少了很多,出现了明显的轮廓痕迹。可以在VS2022里看以下目标图像的像素点值,是不是符合咱们定义的规律。

        经过上面的三个例子,LUT()函数的用法应该很熟悉了吧,但在具体的工程项目中,这个函数到底用处有多大,欢迎大家相互讨论啊。

原创不易,请勿抄袭。共同进步,相互学习。  

这篇关于【Emgu.CV教程】第24篇 、色彩处理之LUT()查找表转换颜色的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/572350

相关文章

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注