【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

相关文章

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示