OpenCV + CPP 系列(六)色彩映射(颜色表)
原创
©著作权归作者所有:来自51CTO博客作者SongpingWang的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
彩色映射
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
#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位就足以表示所有灰度值。
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);
}
鸣谢:
伪色彩:javascript:void(0) 关于像素访问速度比较1:javascript:void(0)