文章目录
- 前言
- 一、函数解析
- 1、LUT查找表(applyColorMap)
- 二、代码示例
- 三、结果展示
- 四、官方教程
- 五、进一步学习
- 1、了解定义
- 2、代码示例
- 3、结果展示
前言
最近心血来潮,想具体的去学习一下图像处理,所以报了知识星球的一个OpenCV研习社,将自己每天的学习,分享一下。写个 blog 加深一下知识。
一、函数解析
1、LUT查找表(applyColorMap)
CV_EXPORTS_W void applyColorMap(InputArray src, OutputArray dst, int colormap)
参数一:CV_8UC1或CV_8UC3类型的灰色或彩色的源图像。
参数二:色彩映射后的源图像。
参数三:匹配到的颜色LUT, OpenCV支持13种颜色风格的查找表映射。
功能:在给定图像上应用GNU Octave / MATLAB等效色彩映射。
参数三的风格如下:
类型 | 属性值 | 颜色风格 | 色谱参照 |
COLORMAP_AUTUMN | 0 | 秋天 | |
COLORMAP_BONE | 1 | 骨感 | |
COLORMAP_JET | 2 | 喷射 | |
COLORMAP_WINTER | 3 | 冬天 | |
COLORMAP_RAINBOW | 4 | 彩虹 | |
COLORMAP_OCEAN | 5 | 海洋 | |
COLORMAP_SUMMER | 6 | 夏天 | |
COLORMAP_SPRING | 7 | 春天 | |
COLORMAP_COOL | 8 | 阴凉 | |
COLORMAP_HSV | 9 | HSV | |
COLORMAP_PINK | 10 | 粉色 | |
COLORMAP_HOT | 11 | 热的 | |
COLORMAP_PARULA | 12 | 森莺 |
二、代码示例
int main()
{
Mat src = imread("C:/Users/XMuser/Desktop/Opencv/cos.jpg");
if (src.empty())
{
printf("could not load image...\n");
return -1;
}
imshow("input", src);
Mat dst;
//进行色彩映射
applyColorMap(src, dst, COLORMAP_SPRING);
imshow("colorMap", dst);
waitKey(0);
return 0;
}
三、结果展示
四、官方教程
传送门:官方教程(最新的OpenCV 4 的用法,其中包含 20 种风格类型)
五、进一步学习
上面介绍的方式是直接采用函数调用的方式,接下来介绍,如何使用我们自己定义的 LUT 来对图片进行颜色映射。
1、了解定义
LUT的应用范围比较广泛,例如:LUT(Look-Up Table)可以应用到一张像素灰度值的映射表,它将实际采样到的像素灰度值经过一定的变换如阈值、反转、二值化、对比度调整、线性变换等,变成了另外一个与之对应的灰度值,这样可以起到突出图像的有用信息,增强图像的光对比度的作用。很多PC系列卡具有8/10/12/16甚到32位的LUT,具体在LUT里进行什么样的变换是由软件来定义的。在这里lut最重要的意义,就在于兼容了普通显示器的高阶显示功能,使得那些不能被普通显示器所显示的宽色域(一般指超过srgb)能够尽量被大致模拟在普通显示器上。然而,lut所模拟的效果,只能作为参考,作为修图时的大致观感。最佳、最完整的呈现,仍然是显示器、显卡以及素材本身的各项指标高度一致,所谓“硬解码”。
为了更直观了理解,可以参考下图:
2、代码示例
void customColorMap(Mat &image)
{
int lut[256];
//这边定义自己的 LUT
for (int i = 0; i < 256; i++)
{
if (i<127)
{
lut[i] = 0;
}
else
{
lut[i] = 255;
}
}
int height = image.rows;
int width = image.cols;
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
int pv = image.at<uchar>(row, col);
image.at<uchar>(row, col) = lut[pv];
}
}
imshow("lut demo", image);
}
int main()
{
Mat src = imread("C:/Users/XMuser/Desktop/Opencv/cos.jpg");
if (src.empty())
{
printf("could not load image...\n");
return -1;
}
imshow("input", src);
Mat gray, dst;
//applyColorMap(src, dst, COLORMAP_SPRING);
//imshow("colorMap", dst);
//转换为灰度图像,仅为示例,少写后面的循环
cvtColor(src, gray, COLOR_BGR2GRAY);
imshow("gray", gray);
customColorMap(gray);
waitKey(0);
return 0;
}
3、结果展示