【发布时间】:2017-08-07 00:13:44
【问题描述】:
我得到了一个 16 位灰度矩阵(Mat 类型 = CV_16UC1),我想使用 OpenCV 和存储在整数数组中的自定义颜色图渐变对其进行着色。颜色图包含 256 种 RGB 颜色,格式如下:
const int colormap[] = {R0, G0, B0, R1, G1, B1, ..., R255, G255, B255};
灰度矩阵的每个像素点包含一个无符号字符(0 到 255 之间),我将其用作索引以在 colormap 数组中查找相应的 RGB 颜色。
新的彩色 Mat 初始化为全黑,尺寸与灰度 Mat 相同,只是它是一个 3 通道矩阵。
cv::Mat colorizedMat = cv::Mat::zeros(matGreyScale.rows, matGreyScale.cols, CV_16UC3);
然后我使用下面的代码循环遍历colorizedMat 的每个像素,并使用从colormap 获得的 RGB 值更新它:
for (int row = 0; row < colorizedMat.rows; row++){
for (int col = 0; col < colorizedMat.cols; col++) {
int pixelVal = matGreyScale.at<uchar>(cv::Point(col,row));
cv::Vec3b color(colormap[pixelVal*3+2],colormap[pixelVal*3+1],colormap[pixelVal*3]);
colorizedMat.at<cv::Vec3b>(cv::Point(col,row)) = color;
}
}
但是,这导致colorizedMat 仅填充了大约一半,而另一半则完全黑色,如下所示。图像也似乎有些拉伸。
原始灰度图: 彩色图:
如果我将内部 for 循环的边界更改为 col < colorizedMat.cols*2,则整个 Mat 会被着色,但是,图像会被拉伸。
如何使用自定义颜色图正确为灰度 Mat 着色?非常感谢任何帮助!
图像很小,因为我接收它们的相机的分辨率为 80x60。
【问题讨论】:
标签: c++ objective-c opencv image-processing colors