个人资料,仅供学习使用
修改时间——2022年2月14日 10:59:22
学习课程:OpenCV4 图像处理与视频分析实战教程
课程讲师:贾志刚
10 图像查找表与颜色表
opencv知识点:
- 查找表 - LUT
- 颜色表 - ColormapTypes
- 应用图像映射 - applyColorMap
本科所解决的问题:
- 什么是查找表?
- 如何使用查找表?
- 如何使用OpenCV中的颜色表?
- 如何循环转换各种颜色风格?
1.图像查找表
图像查找表与颜色表,在图像、视觉相关等的显示场景经常用到。
其中图像查找表,也经常用于加速计算的方面。
查找表介绍
查找表(Look Up Table)简称LUT
通过LUT,可以将一组RGB值输出为另一组RGB值,从而改变画面的曝光与色彩。
LUT(B1, G1, R1) = (B2, G2, R2)
查找表原理
预计算和查找执行
查找表很重要的一点就是预先计算
当我们要处理一个图像,要把每个像素的RGB值通过一个公式转换为另一组RGB值时。
- 如果图像有1000万个像素点,那就要做几百万次处理,运算量很大,非常慢。
- 如果事先对0~255做一个数组,每个值执行一次计算, 转换的时候就直接用这个值,这样就会很快。
查找表就是通过这种预先计算的方式,节约了很多的时间
预计算之后,转换的时候就会通过映射转换成相应的值,而不再一一计算了。示例如下
查找表演示
查找表有两种使用方式
- 用自己的查找表
- 用官方提供的颜色表
当我们用自己的查找表时,要用到这样一个API:LUT
具体介绍如下
LUT
LUT
共3个参数
第1个参数 输入
第2个参数 256个元素的查找表(宽256高1 / 宽1高256 均可,但后续操作要对应)
第3个参数 输出
笔者为了方便,直接去官方文档ColormapTypes
下载了一个颜色
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("D:/WorkSpace/Opencv/images/hahaha.jpg");
if (src.empty()) {
printf("could not find image file");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
Mat color = imread("D:/WorkSpace/Opencv/images/lut.jpg");
imshow("color", color);
Mat lut = Mat::zeros(1, 256, CV_8UC3);
//查找表要求有256个元素,选择的color是20*256,所以这里做成1*256
for (int i = 0; i < 256; i++) {
lut.at<Vec3b>(0,i) = color.at<Vec3b>(0,i);//0~20选一个值即可,都一样
}
Mat dst;
LUT(src, lut, dst);
imshow("lut-demo", dst);
waitKey(0);
destroyAllWindows();
return 0;
}
自制查找表的效果比第二种方式要浅一些
2.图像颜色表
第二种方式的介绍如下
关于图像颜色表的使用,可以阅读 09 Opencv自带颜色表操作,文章中非常详细。
这种方式可以把灰度图像做成伪彩色的效果
本课所用API查阅
LUT
applyColorMap
ColormapTypes