文章目录
- 一、伪彩色
- 二、LUT
- 1. LUT概念
- 2. 作用
- 3. LUT函数
- 4. LUT应用
- 4.1 颜色空间缩减
- 4.2 图像反转
- 三、OpenCV:applyColorMap函数
一、伪彩色
伪彩色(Pseudo-color)图像的每个像素的颜色不是由每个基本色分量的数值直接决定,实际上是把像素当成调色板(Palettes)或颜色查找表(Color Look-Up Table,CLUT)的表项入口地址,根据该地址可查找出包含实际R、G、B的强度值,如果图像中的颜色在调色板或彩色查找表中不存在,则调色板会用一个最为接近的颜色来匹配。通过查找出的R、G、B强度值产生的色彩不是图像本身真正的颜色,因此称为伪彩色。
将彩色图像转换为灰度图像是一个不可逆的过程,灰度图像也不可能变换为原来的彩色图像。而某些场合需要将灰度图像转变为彩色图像;伪彩色处理主要是把黑白的灰度图像或者多波段图像转换为彩色图像的技术过程。其目的是提高图像内容的可辨识度。其中方法有,灰度分成法,灰度变换法。
二、LUT
1. LUT概念
LUT是:Look Up Table(颜色查找表)。
通过LUT,可以将一组RGB值输出为另一组RGB值,从而改变画面的曝光与色彩。
2. 作用
避免对每一个像素都进行一次计算。预先计算每个像素值的对应的匹配值,然后直接对原图中的像素值在LUT中进行查找,即可快速得到匹配值,减少大量不必要的计算。
- LUT 不单单用于图像中。在数据处理中,只要知道原始数据范围、变换公式、变换后得到的数据,也可以使用LUT加快速度。
- LUT实际用途:将一个颜色空间的图匹配到另一个颜色空间;将某个对比度的图匹配到另一对比度;图像增强、产生伪彩色等;
上图中每个格子代表一个像素,左图有30和40两种像素值,经过LUT之后,40匹配到90,30匹配到10。这样就得到了高对比度图像
3. LUT函数
void LUT(InputArray src, InputArray lut, OutputArray dst)
Parameters:
第一个参数:原始图像的地址;
第二个参数:查找表的地址,对于多通道图像的查找,它可以有一个通道,也可以与原始图像有相同的通道;
第三个参数:输出图像的地址。
4. LUT应用
4.1 颜色空间缩减
将现有颜色空间值除以某个输入值,以获得较少的颜色数。例如,颜色值0到9可取为新值0,10到19可取为10,以此类推。(示例来源于OpenCV官网)。
显然这是一个多对一的映射,。很容易想到,只要遍历图像矩阵的每一个像素,对像素应用上述公式就可以完成任务。只是这里用到了除法和乘法运算,而这两种运算又特别费时。鉴于一幅图像只涉及256个像素,我们大可开一个长度为256的数组,让其下标代表旧像素值,数组值代表新的像素值,如这样我们遍历修改时不就可以通过像素值从表中查出要改变的像素值了么,而且这一过程只有赋值运算。
4.2 图像反转
显然这是一个一对一的映射,即像素值0变为255,1变为254,2变成253······255变为0,254变成1,253变成2。对应的查找表为:
🔲🔲🔲算法实现:
void Invert(Mat &img,const uchar* const lookup) {
for (int i = 0; i < img.rows; i++)
{
uchar* p = img.ptr<uchar>(i);
for (int j = 0; j < img.cols; j++)
{
p[j] = lookup[p[j]];
}
}
}
int main() {
Mat src = imread("D:/test/11.jpeg");
imshow("src", src);
Mat img1;
cvtColor(src, img1, COLOR_RGB2GRAY);
imshow("img1", img1);
uchar lut[256];
for (int i = 0; i < 255; i++)
{
lut[i] = 255 - i;
}
Invert(img1,lut );
imshow("img2", img1);
waitKey(0);
return 0;
}
🔲🔲🔲opencv直接实现:
Mat lookUpTable(1, 256, CV_8U);
uchar* p = lookUpTable.data;
for (int i = 0; i < 256; i++)
p[i] = 255 - i;
//通过LUT函数实现图像取反
LUT(img1, lookUpTable, img1);
三、OpenCV:applyColorMap函数
OpenCV的定义12种colormap (色度图) ,可以应用于灰度图像,使用函数applycolormap产生伪彩色图像。
Mat im_gray = imread("D:/test/2.jpg", IMREAD_GRAYSCALE);
Mat im_color;
applyColorMap(im_gray, im_color, COLORMAP_JET);