2013-03-11 66 views
2

我需要將具有3個通道的CV_8U圖像轉換爲必須是單通道CV_32S的圖像。但是當我試圖這樣做時,我得到的圖像全是黑色的。我不明白爲什麼我的代碼無法正常工作。OpenCV:將CV_8UC3圖像轉換爲C++中的CV_32S1圖像

我正在處理灰度圖像,這就是爲什麼我將3通道圖像分成單通道圖像的矢量,然後只處理第一個通道。

//markers->Image() returns a valid image, so this is not the problem 

cv::Mat dst(markers->Image().size(), CV_32SC1); 
dst = cv::Scalar::all(0); 
std::vector<cv::Mat> vectmp; 
cv::split(markers->Image(), vectmp); 
vectmp.at(0).convertTo(dst, CV_32S); 

//vectmp.at(0) is ok, but dst is black...? 

在此先感謝您。

+1

你爲什麼不先做灰度轉換,即考慮所有三個顏色通道? – 2013-03-11 11:24:07

回答

3

您是否試圖獲取結果圖像的值?像這樣:

for (int i=0; i<result.rows; i++) 
{ 
    for (int j=0; j<result.cols; j++) 
    { 
     cout << result.at<int>(i,j) << endl; 
    } 
} 

我已經轉換(也用於convertTo)無規灰度單通道圖像CV_32S(它是爲每個像素有符號的32位整數值)我的輸出是這樣的:

80 
111 
132 

當我試圖顯示它時,我也會得到黑色圖像。從documentation

如果圖像是16位無符號或32位的整數,所述像素是 由256被劃分,值的範圍[0,255 * 256]被映射到 [0,255]。

因此,如果你將這些小數除以255,你會得到0(int類型)。這就是爲什麼imshow顯示黑色圖像。

0

如果要顯示32位圖像並看到有意義的結果,則需要在調用imshow之前將其所有元素相乘256。否則,imshow會將您的值縮小到零,並且您會看到一個黑色圖像(正如Astor指出的那樣)。

由於原始值是8位無符號的,因此它們必須小於255.因此,將它們乘以256是安全的,不會溢出32位整數。

編輯我才意識到你的輸出類型是簽署 32位整數,但原來的類型是無符號 8位整數。在這種情況下,您需要適當縮放您的值(查看scaleAdd)。

最後,在開始丟棄圖像通道之前,您可能需要確保圖像採用YCbCr格式。

0

我相信這就是你要找的。將您的圖像轉換爲8位單通道。 CV_8UC1。您是從一個8位圖像開始,將其更改爲32位單通道?爲什麼?保持8位。

0

我有同樣的問題,試圖將8UC1轉換爲32S而不是8UC3來間接解決它。

RgbToGray接受使用8UC3或8UC1元素類型創建灰色圖像。 8UC1圖像是我的標記圖像。

我在Opencvsharp做到了這一點:

Mat buf3 = new Mat(iplImageMarker); 
buf3.ConvertTo(buf3, MatType.CV_32SC1); 
iplImageMarker= (IplImage)buf3; 

iplImageMarker=iplImageMarker* 256;