语义分割得到的图片都是灰度图,不利于查看分割效果,通过对label值进行三次线性变化,可以分别得到关于R、G、B三个通道的伪彩色,然后生成一副伪彩色图像。也可以通过LUT函数设置颜色查找表,得的RGB图像。下面分享两种实现方式。
方式一、线性变化
具体代码如下所示:针对不同class_num的label数据集,只需要调整代码里面的class_num即可
cv::Mat set_color(cv::Mat label) {
int class_num = 8;//一个有8个类别
int color_setp = int(255 / class_num);
cv::Mat tmp,bg;
label.copyTo(tmp);
//把背景置成白色
//把图像中大于0的部分全部赋值为0,小于等于0的部分赋值为255
threshold(tmp, bg, 0, 255, THRESH_BINARY_INV);
cv::Mat G = (class_num - label) * color_setp;
cv::Mat R = label * color_setp;
cv::Mat B = (R + G) / 2;
B.convertTo(B, CV_8UC1);
//让背景是白色的
vector<cv::Mat> mv;
mv.push_back(R + bg);
mv.push_back(G + bg);
mv.push_back(B + bg);
cv::Mat RGB;
cv::merge(mv, RGB);
return RGB;
}
生成的伪彩色图像效果如图1所示,背景是白色的。
方式二、自定义LUT
Mat applyCustomColorMap2(Mat im_gray)
{
//创建RGB格式的颜色对应表
unsigned char rgb[256][3] = {
{255,255,255},
{0,0,255},
{0,153,0},
{0,92,0},
{160,160,164},
{96,96,96},
{128,0,0},
{255,0,0},
{0,255,0},
};
Mat lut = Mat(256, 1, CV_8UC3, rgb); // 创建查找表
cvtColor(lut, lut, COLOR_RGB2BGR);//将RGB格式的颜色查找表转换为BGR格式
//将传入的灰度图转换为彩色图
cv::Mat im_p_color;
cvtColor(im_gray.clone(), im_p_color, COLOR_GRAY2BGR);
//为im_p_color设置颜色
Mat im_color;
LUT(im_p_color, lut, im_color);
return im_color;
}
cv::Mat im = cv::imread(fname, 0);//, cv::ImreadModes::IMREAD_COLOR
Mat im_color = applyCustomColorMap(im);
imshow("Pseudo Colored Image", im_color);