我已經提供了一個16位灰度矩陣(Mat type = CV_16UC1),我想用OpenCV和整數數組中存儲的自定義顏色映射漸變着色。顏色表包含256種RGB顏色並且是以下格式的:着色16位灰度墊只產生圖像的一半
const int colormap[] = {R0, G0, B0, R1, G1, B1, ..., R255, G255, B255};
灰度矩陣包含單個無符號字符(0到255之間)每像素點我使用作爲索引來查找對應RGB顏色在colormap
陣列中。
新的彩色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
,全墊着色成,但是,圖像被拉伸極。
如何使用自定義顏色映射正確着色灰度墊?任何幫助是極大的讚賞!
圖像很小,因爲我收到的相機具有80x60的分辨率。
感謝您的提示和鏈接。我使用Vec3s聲明瞭這些矢量,並以這種方式填充矩陣並返回了全寬矩陣 – Tex4066