OpenCV学习笔记(十一)之LUT使用

LUT原理

  提到LUT,很多人可能都会觉得这是一个很专业很高深的词汇,LUT其实就是Look Up Table(颜色查找表)的缩写,简单点儿理解就是:通过LUT,我们可以将一组RGB值输出为另一组RGB值,从而改变画面的曝光与色彩。LUT文件就是一个包含了可以改变输入颜色信息的矩阵数据。LUT本身并不进行运算,只需在其中列举一系列输入与输出数据即可,这些数据呈一一对应的关系,系统按照此对应关系为每一个输入值查找到与其对应的输出值,这样即可完成转换,也是LUT基本不消耗CPU资源的原因。

1D LUT 和 3D LUT 的区别

  LUT分为两种,一种是1D的,一种是3D的,即俗称的一维查找表和三维查找表。两者在结构上有着本质的区别,应用的领域也不同,二者的区别如下:
1D LUT的输入与输出关系如以下公式:
R o u t = L U T ( R i n ) Rout = LUT(Rin) Rout=LUT(Rin)
G o u t = L U T ( G i n ) Gout=LUT(Gin) Gout=LUT(Gin)
B o u t = L U T ( B i n ) Bout=LUT(Bin) Bout=LUT(Bin)

  该LUT输出的三个色彩分量仅与自身分量的输入有关,而与另外两个分量的输入无关,这种分量之间一一对应的关系就是1D LUT。对于10比特系统来说,一个1D LUT包含1024 x 3个10比特数据,总的数据量为1024 x 3 x 10=30Kbit,可见一个1D LUT的文件量是相当小的。1D LUT具有数据量小、查找速度快的特点。

3D LUT输人与输出关系如以下公式:
R o u t = L U T ( R i n , G i n , B i n ) Rout=LUT(Rin,Gin,Bin) Rout=LUT(RinGinBin)
G o u t = L U T ( R i n , G i n , B i n ) Gout=LUT(Rin,Gin,Bin) Gout=LUT(RinGinBin)
B o u t = L U T ( R i n , G i n , B i n ) Bout=LUT(Rin,Gin,Bin) Bout=LUT(RinGinBin)
  以上公式表达的是3D LUT的对应关系,从中可以看到转换后色彩空间的每一种色彩与转换前的RGB三色均相关,这也是3D LUT区别于1D LUT最本质的特点。3D LUT的数据量是非常大的,因此需要采用插值的方式计算,也就是进行一定节点的采样,节点的数目是衡量3D LUT精度的重要标志。3DLUT的节点数目一般是2n+l,譬如17、33、65、129、257等,目前市面上的色彩管理系统可支持最高的单色彩通道节点数目为257。

openCV中LUT的API函数

  在OpenCV中LUT被封装在如下函数中:

/** @example samples/cpp/falsecolor.cpp
An example using applyColorMap function
*/
/** @brief Applies a GNU Octave/MATLAB equivalent colormap on a given image.
@param src The source image, grayscale or colored of type CV_8UC1 or CV_8UC3.
@param dst The result is the colormapped source image. Note: Mat::create is called on dst.
@param colormap The colormap to apply, see #ColormapTypes
*/
CV_EXPORTS_W void applyColorMap(InputArray src, OutputArray dst, int colormap);

其中,

  • src为输入的源图像,其可以为灰度图像、8位单通道图像或8位三通道图像;
  • dst为输出图像,图像大小与类型与源图像一致;
  • colormap为颜色查找表类型,总共有20种,具体如下:
//! GNU Octave/MATLAB equivalent colormaps
enum ColormapTypes
{
    COLORMAP_AUTUMN = 0, //!< [外链图片转存失败(img-dQ0JmQ61-1562152862468)(pics/colormaps/colorscale_autumn.jpg)]
    COLORMAP_BONE = 1, //!< [外链图片转存失败(img-FcjTV2xt-1562152862469)(pics/colormaps/colorscale_bone.jpg)]
    COLORMAP_JET = 2, //!< [外链图片转存失败(img-Mqoa9jdm-1562152862472)(pics/colormaps/colorscale_jet.jpg)]
    COLORMAP_WINTER = 3, //!< [外链图片转存失败(img-5FuUDWNl-1562152862473)(pics/colormaps/colorscale_winter.jpg)]
    COLORMAP_RAINBOW = 4, //!< [外链图片转存失败(img-cB4VMPhW-1562152862474)(pics/colormaps/colorscale_rainbow.jpg)]
    COLORMAP_OCEAN = 5, //!< [外链图片转存失败(img-LGVMq1iF-1562152862477)(pics/colormaps/colorscale_ocean.jpg)]
    COLORMAP_SUMMER = 6, //!< [外链图片转存失败(img-Amo0UpmG-1562152862478)(pics/colormaps/colorscale_summer.jpg)]
    COLORMAP_SPRING = 7, //!< [外链图片转存失败(img-wQkSzhsz-1562152862478)(pics/colormaps/colorscale_spring.jpg)]
    COLORMAP_COOL = 8, //!< [外链图片转存失败(img-8stkZF6e-1562152862479)(pics/colormaps/colorscale_cool.jpg)]
    COLORMAP_HSV = 9, //!< [外链图片转存失败(img-VBREbSQZ-1562152862480)(pics/colormaps/colorscale_hsv.jpg)]
    COLORMAP_PINK = 10, //!< [外链图片转存失败(img-ZDKdXZw7-1562152862480)(pics/colormaps/colorscale_pink.jpg)]
    COLORMAP_HOT = 11, //!< [外链图片转存失败(img-cJfjdNHj-1562152862481)(pics/colormaps/colorscale_hot.jpg)]
    COLORMAP_PARULA = 12, //!< [外链图片转存失败(img-mfrH5CDM-1562152862482)(pics/colormaps/colorscale_parula.jpg)]
    COLORMAP_MAGMA = 13, //!< [外链图片转存失败(img-GRtXtB2v-1562152862482)(pics/colormaps/colorscale_magma.jpg)]
    COLORMAP_INFERNO = 14, //!< [外链图片转存失败(img-OwFMmfzZ-1562152862483)(pics/colormaps/colorscale_inferno.jpg)]
    COLORMAP_PLASMA = 15, //!< [外链图片转存失败(img-ySKUk0fO-1562152862484)(pics/colormaps/colorscale_plasma.jpg)]
    COLORMAP_VIRIDIS = 16, //!< [外链图片转存失败(img-evKMBOo9-1562152862485)(pics/colormaps/colorscale_viridis.jpg)]
    COLORMAP_CIVIDIS = 17, //!< [外链图片转存失败(img-WSJYt3XS-1562152862485)(pics/colormaps/colorscale_cividis.jpg)]
    COLORMAP_TWILIGHT = 18, //!< [外链图片转存失败(img-RimtGaRW-1562152862486)(pics/colormaps/colorscale_twilight.jpg)]
    COLORMAP_TWILIGHT_SHIFTED = 19 //!< [外链图片转存失败(img-6EmnZcmQ-1562152862486)(pics/colormaps/colorscale_twilight_shifted.jpg)]
};

该函数使用起来非常简单,只需将源图像及类型丢进去就能很快得到结果,LUT效果如下:
colormap = COLORMAP_BONE 时,效果图如下:

colormap = COLORMAP_JET 时,效果图如下:

colormap = COLORMAP_PINK 时,效果图如下:

代码实现

// LUTApply.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include 
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main()
{
	Mat srcImage = imread("scenery1.jpg");
	if (nullptr == srcImage.data)
	{
		cout << "Image Load Fail" << endl;
		return -1;
	}

	Mat dstImage;
	namedWindow("src", WINDOW_AUTOSIZE);
	namedWindow("dst", WINDOW_AUTOSIZE);

	for (int i = 0; i < 20; i++)
	{
		applyColorMap(srcImage, dstImage, i);
		imshow("src", srcImage);
		imshow("dst", dstImage);
		while (true)
		{
			if (waitKey() == 9)   //按Tab键可切换前一个效果
			{
				break;
			}
			else if(waitKey() == 27)  //按ESC退出
				return 0;
		}
	}
	destroyAllWindows();
	return 0;
}

你可能感兴趣的:(OpenCV学习笔记)