彩色映射 cv::applyColorMap() 与 cv::LUT() 函数
一、cv::applyColorMap()
cv::applyColorMap()是使用opencv预定义的colormap,将灰度图映射成彩色图像。opencv中提供了20个预定义的colormaps,如下函数参数所示
函数参数
No. | cpp | python | 图像示例 |
---|---|---|---|
1 | COLORMAP_AUTUMN | cv2.COLORMAP_AUTUMN | ![]() |
2 | COLORMAP_BONE | cv2.COLORMAP_BONE | ![]() |
3 | COLORMAP_JET | cv2.COLORMAP_JET | ![]() |
4 | COLORMAP_WINTER | cv2.COLORMAP_WINTER | ![]() |
5 | COLORMAP_RAINBOW | cv2.COLORMAP_RAINBOW | ![]() |
6 | COLORMAP_OCEAN | cv2.COLORMAP_OCEAN | ![]() |
7 | COLORMAP_SUMMER | cv2.COLORMAP_SUMMER | ![]() |
8 | COLORMAP_SPRING | cv2.COLORMAP_SPRING | ![]() |
9 | COLORMAP_COOL | cv2.COLORMAP_COOL | ![]() |
10 | COLORMAP_HSV | cv2.COLORMAP_HSV | ![]() |
11 | COLORMAP_PINK | cv2.COLORMAP_PINK | ![]() |
12 | COLORMAP_HOT | cv2.COLORMAP_HOT | ![]() |
13 | COLORMAP_PARULA | cv2.COLORMAP_PARULA | ![]() |
14 | COLORMAP_MAGMA | cv2.COLORMAP_MAGMA | ![]() |
15 | COLORMAP_INFERNO | cv2.COLORMAP_INFERNO | ![]() |
16 | COLORMAP_PLASMA | cv2.COLORMAP_PLASMA | ![]() |
17 | COLORMAP_VIRIDIS | cv2.COLORMAP_VIRIDIS | ![]() |
18 | COLORMAP_CIVIDIS | cv2.COLORMAP_CIVIDIS | ![]() |
19 | COLORMAP_TWILIGHT | cv2.COLORMAP_TWILIGHT | ![]() |
20 | COLORMAP_TWILIGHT_SHIFTED | cv2.COLORMAP_TWILIGHT_SHIFTED | ![]() |
opencv-python实现效果:点击查看。
头文件 quick_opencv.h
:添加声明公共函数
#pragma once
#include <opencv2\opencv.hpp>
using namespace cv;
class QuickDemo {
public:
void color_style_Demo(Mat& image);
void LUT_Demo(Mat& image);
};
主函数调用该类的公共成员函数
#include <opencv2\opencv.hpp>
#include <quick_opencv.h>
#include <iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat src = imread("D:\\Desktop\\pandas_small2.png");
if (src.empty()) {
printf("Could not load images...\n");
return -1;
}
namedWindow("input", WINDOW_NORMAL);
imshow("input", src);
QuickDemo qk;
qk.color_style_Demo(src);
qk.LUT_Demo(src);
waitKey(0);
destroyAllWindows();
return 0;
}
方法演示
源文件 quick_demo.cpp
:实现类与公共函数
#include <quick_opencv.h>
// 新增了实现函数
void QuickDemo::color_style_Demo(Mat& image) {
int colormap[] = {
COLORMAP_AUTUMN,
COLORMAP_BONE,
COLORMAP_JET,
COLORMAP_WINTER,
COLORMAP_RAINBOW,
COLORMAP_OCEAN,
COLORMAP_SUMMER,
COLORMAP_SPRING,
COLORMAP_COOL,
COLORMAP_HSV,
COLORMAP_PINK,
COLORMAP_HOT,
COLORMAP_PARULA,
COLORMAP_MAGMA,
COLORMAP_INFERNO,
COLORMAP_PLASMA,
COLORMAP_VIRIDIS,
COLORMAP_CIVIDIS,
COLORMAP_TWILIGHT,
COLORMAP_TWILIGHT_SHIFTED,
};
Mat dst;
int index = 0;
while (true)
{
int c = waitKey(2000);
if (c == 27) {
break;
}
applyColorMap(image, dst,colormap[index%19]);
imwrite("D:\\Desktop\\" + std::to_string(colormap[index % 19]) + ".png", dst);
index++;
// 保存18张图片
imshow("颜色风格", dst);
if (index == 18) {
break;
}
}
}
二、cv::LUT
LUT(Look-Up Table) 像素映射表。
它将实际采样到的像素灰度值经过一定的变换如阈值、反转、二值化、对比度调整、线性变换等,变成了另外一个与之对应的灰度值,这样可以起到突出图像的有用信息,增强图像的光对比度的作用。
其实查询表的实质就是:把图像中的数据从之前的比较高的灰度级降下来,例如灰度级是256的char类型的灰度级,我们通过一个参数,将原来的256个灰度级降到了3个灰度级,原来图像中灰度值在0-100的数据现在灰度值变成了0,原来灰度值为101-200的图像数据现在灰度值变为了1,而201-256的灰度值就变为了2。所以通过参数100,图像的灰度级就到了2,只有0,1,2三个灰度值,那么原来的图像矩阵中的每一位数据我们是char型的,需要8位来表示一个数据,而灰度级降下来之后,我们只需要2位就足以表示所有灰度值。
-
void LUT(
-
InputArray src, 输入图像(可以是单通道也可是3通道)
InputArray lut, 查找表(与输入图像通道数相同)
OutputArray dst 输出图像
);
// 定义灰度图 像素映射关系表
void generator_lutdata_U1(uchar* lutdata) {
for (int i = 0; i < 256; i++) {
if (i < 128) { lutdata[i] = 0; }
else if (i > 128 && i<200) { lutdata[i] = 128; }
else { lutdata[i] = 255; }
}
}
// 定义BGR图 像素映射关系表
void generator_lutdata_U3(uchar* lutdata_U3) {
for (int i = 0; i < 256; i++){
if (i <= 100){
lutdata_U3[i * 3] = 0;
lutdata_U3[i * 3 + 1] = 50;
lutdata_U3[i * 3 + 2] = 50;
}
if (i > 100 && i <= 200){
lutdata_U3[i * 3] = 100;
lutdata_U3[i * 3 + 1] = 10;
lutdata_U3[i * 3 + 2] = 200;
}
if (i > 200){
lutdata_U3[i * 3] = 255;
lutdata_U3[i * 3 + 1] = 200;
lutdata_U3[i * 3 + 2] = 100;
}
}
}
void QuickDemo::LUT_Demo(Mat& image) {
// 单通道映射
Mat gray_img, dst;
cvtColor(image, gray_img, COLOR_BGR2GRAY);
uchar lutdata[256] = {0};
generator_lutdata_U1(lutdata);
Mat lut(1, 256, CV_8UC1, lutdata);
LUT(gray_img, lut, dst);
imshow("gray_img", gray_img);
imshow("dst", dst);
// 3通道映射
Mat dst_u3;
uchar lutdata_U3[256 * 3] = {0};
generator_lutdata_U3(lutdata_U3);
Mat lut_U3(1, 256, CV_8UC3, lutdata_U3);
LUT(image, lut_U3, dst_u3);
imshow("dst_u3", dst_u3);
}
鸣谢:
伪色彩:https://blog.csdn.net/jningwei/article/details/78803669
关于像素访问速度比较1:https://blog.csdn.net/xiaowei_cqu/article/details/7771760