真彩色是指影像中的物体颜色和人类肉眼所见的颜色非常相似。在黑白影像中全彩则是指物体的明亮程度。但因为颜色染料等媒体的化学等性质和人类肉眼不同,因此不可能得到绝对的真彩色。
伪彩色的概念就是相较于真彩色提出来的。对于灰度图像,我们可以依据不同像素点的灰度值不同,对R、G、B三个通道进行不同规律的赋值,并将三个通道融合组成一幅伪彩色图像。
1.C++自己实现灰度图像转伪彩色图像
下面介绍一种常见的基于灰度值阶数不同而实现的伪彩色映射。其将256阶灰度阶数分为四段,分别对应R、G、B三通道下的不同映射函数。
C++实现如下(需要配置OpenCV):
void test(Mat &inputimg, Mat &outputimg)
{
vector<Mat> mv(3);
Mat out;
Mat Rimage = inputimg.clone();
Mat Gimage = inputimg.clone();
Mat Bimage = inputimg.clone();
int rowNum = inputimg.rows;
int colNum = inputimg.cols;
//遍历实现每个像素点的RGB三通道赋值
for (int i = 0; i < rowNum; i++)
{
uchar *data1 = inputimg.ptr<uchar>(i);
uchar *dataR = Rimage.ptr<uchar>(i);
uchar *dataG = Gimage.ptr<uchar>(i);
uchar *dataB = Bimage.ptr<uchar>(i);
for (int j = 0; j < colNum; j++)
{
if (data1[j] <= 255 / 4)
{
dataR[j] = 0;
dataG[j] = 4*data1[j];
dataB[j] = 255;
}
else if (data1[j] <= 255 / 2)
{
dataR[j] = 0;
dataG[j] = 255;
dataB[j] = -4 * data1[j] + 2 * 255;
}
else if (data1[j] <= 255 / 3)
{
dataR[j] = 4 * data1[j] - 2 * 255;
dataG[j] = 255;
dataB[j] = 0;
}
else
{
dataR[j] = 255;
dataG[j] = 4 * (255 - data1[j]);
dataB[j] = 0;
}
}
}
mv[0] = Bimage;
mv[1] = Gimage;
mv[2] = Rimage;
//将三通道融合成彩色图想
merge(mv, out);
outputimg = out.clone();
}
2.调用OpenCV的applyColorMap函数
同时在OpenCV中也提供了现成的applyColorMap函数可以直接产生伪彩色图像,同时提供多种颜色映射表可以选择。
void cv::applyColorMap (InputArray src,
OutputArray dst,
int colormap
)
/*
参数
src 灰度或彩色的源图像,类型为CV_8UC1或CV_8UC3。
dst 结果是伪彩色映射后的图像。
colormap 要应用的颜色映射类型
*/
下面是colormap的映射表: