OpenCV4学习笔记(3)——图像的LUT(查找表)

这次要整理的内容只有一个,就是LUT(Look Up Tabel)查找表。看起来很高大上,其实很简单,就是将一张图像的像素值通过某种规定好的映射方式,将满足某些条件的像素值映射到一个新的像素值,从而使图像呈现出不同的效果。而这个所谓的规定好的映射方式,其实就是我们要用的LUT查找表。LUT查找表主要可以应用在伪彩色增强上,或者是通俗点的用法,就是给图像加滤镜,变化图像的风格。
这里提供一个简单的LUT查找表的实现方式,代码如下:

	Mat image;
	image = imread("D:/opencv_c++/cat.jpg");
	resize(image, image, Size(600, 400));
	cvtColor(image, image, COLOR_BGR2GRAY);
	/**********************基础功能实现**********************/
	int LUT[256];			//定义查找表;灰度值的映射
	for (int i = 0; i < 256; i++)
	{
		if (i < 50)
		{
			LUT[i] = 10;
		}
		else if (i >= 50 && i < 100)
		{
			LUT[i] = 50;
		}
		else if (i >= 100 && i < 200)
		{
			LUT[i] = 200;
		}
		else
		{
			LUT[i] = 255;
		}
	}
	int height = image.rows;
	int width = image.cols;
	int ch = image.channels();
	Mat output = image.clone();
	for (int row = 0; row < height; row++)
	{
		uchar* currentRow = image.ptr<uchar>(row);
		uchar* outputRow = output.ptr<uchar>(row);
		for (int col = 0; col < width; col++)
		{
			if (ch == 3)
			{
				*outputRow = saturate_cast<uchar>(LUT[*currentRow]);
				for (int j = 0; j < 3; j++)
				{
					outputRow++;
					currentRow++;
				}
			}
			else if (ch == 1)
			{
				*outputRow = saturate_cast<uchar>(LUT[*currentRow]);
				outputRow++;
				currentRow++;
			}
	
		}
	}
	namedWindow("LUT-output", WINDOW_AUTOSIZE);
	moveWindow("LUT-output", 800, 200);
	imshow("LUT-output", output);
	/**********************基础功能实现**********************/

在基础功能实现代码中,我首先定义了一个数组“LUT[256]”,这个数组的容量为256,表示像素的灰度值是从0~255的区间。随后对LUT[256]从0到255进行遍历,将下标i 位于[0 , 50) 的LUT[i] 赋值为10, 将下标位于[50 , 100) 的LUT[i]赋值为50,将下标位于[100 , 200) 的LUT[i]赋值为200,最后将下标位于[ 200, 255 ] 的LUT[i]赋值为255。这样就完成了一个LUT查找表,定义好了自己的灰度值映射方式。
然后我们对输入图像进行遍历,将输入图像的每个像素点的像素值作为LUT查找表的下标,从而获取映射得到的新的像素值,并将新的像素值赋给输出图像的该像素点上。这样就完成了对一幅图像的伪彩色增强。要注意的是输入图像是三通道图像或是单通道图像, 在上述代码中使用指针遍历针对不同通道图的不同处理来分别处理三通道和单通道图像。
自定义LUT查找表效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
除了自定义外,OpenCV也提供了API可以直接使用,代码如下:

	applyColorMap(image, image, COLORMAP_AUTUMN);
	applyColorMap(image, image, COLORMAP_BONE);
	applyColorMap(image, image, COLORMAP_CIVIDIS);
	applyColorMap(image, image, COLORMAP_COOL);
	applyColorMap(image, image, COLORMAP_HOT);
	applyColorMap(image, image, COLORMAP_HSV);
	applyColorMap(image, image, COLORMAP_INFERNO);
	applyColorMap(image, image, COLORMAP_JET);
	applyColorMap(image, image, COLORMAP_MAGMA);
	applyColorMap(image, image, COLORMAP_OCEAN);
	applyColorMap(image, image, COLORMAP_PARULA);
	applyColorMap(image, image, COLORMAP_PINK);
	applyColorMap(image, image, COLORMAP_PLASMA);
	applyColorMap(image, image, COLORMAP_RAINBOW);
	applyColorMap(image, image, COLORMAP_SPRING);
	applyColorMap(image, image, COLORMAP_SUMMER);
	applyColorMap(image, image, COLORMAP_TURBO);
	applyColorMap(image, image, COLORMAP_TWILIGHT);
	applyColorMap(image, image, COLORMAP_TWILIGHT_SHIFTED);
	applyColorMap(image, image, COLORMAP_VIRIDIS);
	applyColorMap(image, image, COLORMAP_WINTER);

applyColorMap()函数,第一个参数是输入图像,第二个参数是输出图像,第三个参数就是我们使用的变换效果,也可以理解为滤镜。。?总共有21种方式可以选择,每个效果名称还是很明显的,可以自行尝试下效果。
好了这次就记录到这啦~

PS:本人的注释比较杂,既有自己的心得体会也有网上查阅资料时摘抄下的知识内容,所以如有雷同,纯属我向前辈学习的致敬,如果有前辈觉得我的笔记内容侵犯了您的知识产权,请和我联系,我会将涉及到的博文内容删除,谢谢!

发布了36 篇原创文章 · 获赞 43 · 访问量 1823

猜你喜欢

转载自blog.csdn.net/weixin_45224869/article/details/104531536