2017-03-16 133 views
1

我已經提供了一個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僅是如下圖所示,大約在一半處填滿,另一半則完全變黑。圖像也似乎稍微拉伸。

原始灰度圖像:OriginalGreyScale彩色化圖像:Colorized

如果我改變了內部的for循環的邊界來col < colorizedMat.cols*2,全墊着色成,但是,圖像被拉伸極。

如何使用自定義顏色映射正確着色灰度墊?任何幫助是極大的讚賞!

圖像很小,因爲我收到的相機具有80x60的分辨率。

回答

2

數我看到的問題。

  1. 您的matGreyScale被宣告爲CV_16UC1。但是,您嘗試使用matGreyScale.at<uchar>(cv::Point(col,row));訪問其元素。這是不正確的,因爲應該使用matGreyScale.at<unsigned short>(...)訪問CV_16UC1。它很混亂,因爲CV_16UC1聽起來像「無符號字符」,但它確實是「16位,無符號,通道= 1)」。請參閱:http://dovgalecs.com/blog/opencv-matrix-types/

  2. 如果聲明colorizedMatCV_16UC3你應該填充這個矩陣創建Vec3s類型的載體。或者,你可以做Q.H.並建議colorizedMatCV_8UC3,並堅持創建類型爲Vec3b的載體(當色彩映射數據的縮放比例爲0-255時更有意義)。請參閱: http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#vec

+0

感謝您的提示和鏈接。我使用Vec3s聲明瞭這些矢量,並以這種方式填充矩陣並返回了全寬矩陣 – Tex4066

-1

我不熟悉OpenCV。但我認爲這是錯誤的訂單時,你的電話Point()

Point_ (_Tp _x, _Tp _y)  
Template class for 2D points specified by its coordinates x and y. 

更改您的代碼,如:

Point(row,col) 

魔法門幫助,可能不會。

+1

的'x'協調將是列數和'y'協調會行,所以自變量在OP代碼奧得是正確的。另外,如果這兩個交換,圖像將被轉置,而不是簡單地減半。 – beaker

+0

好吧,你是對的。 –

0

的問題是,你有不正確的深度宣佈colorizedMat

cv::Mat colorizedMat = cv::Mat::zeros(matGreyScale.rows, matGreyScale.cols, CV_16UC3); 

應該CV_8UC3,而不是CV_16UC3。由於Vec3b相同與Vec<uchar, 3>,你只能用命令來更新一半的colorizedMat.data

colorizedMat.at<cv::Vec3b>(cv::Point(col,row)) = color; 

此外,爲了安全起見,聲明彩色地圖爲uchar(或unsigned char)類型:

const uchar colormap[] = {R0, G0, B0, R1, G1, B1, ..., R255, G255, B255};