文章目录


彩色映射

cv::applyColorMap()

cv::LUT() 函数

一、cv::applyColorMap()

cv::applyColorMap()是使用opencv预定义的colormap,将灰度图映射成彩色图像。opencv中提供了20个预定义的colormaps,如下函数参数所示

函数参数

No.

cpp

python

图像示例

1

COLORMAP_AUTUMN

cv2.COLORMAP_AUTUMN

OpenCV + CPP 系列(六)色彩映射(颜色表)_#include

2

COLORMAP_BONE

cv2.COLORMAP_BONE

OpenCV + CPP 系列(六)色彩映射(颜色表)_opencv_02

3

COLORMAP_JET

cv2.COLORMAP_JET

OpenCV + CPP 系列(六)色彩映射(颜色表)_c++_03

4

COLORMAP_WINTER

cv2.COLORMAP_WINTER

OpenCV + CPP 系列(六)色彩映射(颜色表)_opencv_04

5

COLORMAP_RAINBOW

cv2.COLORMAP_RAINBOW

OpenCV + CPP 系列(六)色彩映射(颜色表)_opencv_05

6

COLORMAP_OCEAN

cv2.COLORMAP_OCEAN

OpenCV + CPP 系列(六)色彩映射(颜色表)_#include_06

7

COLORMAP_SUMMER

cv2.COLORMAP_SUMMER

OpenCV + CPP 系列(六)色彩映射(颜色表)_c++_07

8

COLORMAP_SPRING

cv2.COLORMAP_SPRING

OpenCV + CPP 系列(六)色彩映射(颜色表)_#include_08

9

COLORMAP_COOL

cv2.COLORMAP_COOL

OpenCV + CPP 系列(六)色彩映射(颜色表)_opencv_09

10

COLORMAP_HSV

cv2.COLORMAP_HSV

OpenCV + CPP 系列(六)色彩映射(颜色表)_#include_10

11

COLORMAP_PINK

cv2.COLORMAP_PINK

OpenCV + CPP 系列(六)色彩映射(颜色表)_c++_11

12

COLORMAP_HOT

cv2.COLORMAP_HOT

OpenCV + CPP 系列(六)色彩映射(颜色表)_c++_12

13

COLORMAP_PARULA

cv2.COLORMAP_PARULA

OpenCV + CPP 系列(六)色彩映射(颜色表)_灰度值_13

14

COLORMAP_MAGMA

cv2.COLORMAP_MAGMA

OpenCV + CPP 系列(六)色彩映射(颜色表)_opencv_14

15

COLORMAP_INFERNO

cv2.COLORMAP_INFERNO

OpenCV + CPP 系列(六)色彩映射(颜色表)_opencv_15

16

COLORMAP_PLASMA

cv2.COLORMAP_PLASMA

OpenCV + CPP 系列(六)色彩映射(颜色表)_c++_16

17

COLORMAP_VIRIDIS

cv2.COLORMAP_VIRIDIS

OpenCV + CPP 系列(六)色彩映射(颜色表)_数据_17

18

COLORMAP_CIVIDIS

cv2.COLORMAP_CIVIDIS

OpenCV + CPP 系列(六)色彩映射(颜色表)_c++_18

19

COLORMAP_TWILIGHT

cv2.COLORMAP_TWILIGHT

OpenCV + CPP 系列(六)色彩映射(颜色表)_灰度值_19

20

COLORMAP_TWILIGHT_SHIFTED

cv2.COLORMAP_TWILIGHT_SHIFTED

OpenCV + CPP 系列(六)色彩映射(颜色表)_c++_20

opencv-python实现效果:​​点击查看​​。

头文件 ​​quick_opencv.h​​:添加声明公共函数

#pragma
#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;
}
}
}

OpenCV + CPP 系列(六)色彩映射(颜色表)_opencv_21

二、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位就足以表示所有灰度值。


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);
}

OpenCV + CPP 系列(六)色彩映射(颜色表)_数据_22

鸣谢:
伪色彩:​​​javascript:void(0)​​​ 关于像素访问速度比较1:​​javascript:void(0)​