【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

相关文章

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark