2013-06-27 76 views
1

我正在尋找使用C++/OpenCV將圖像的像素值標準化到[0..1]範圍。但是,當我使用image *= 1./255或歸一化函數進行歸一化時,像素值會舍入爲零。我試圖設置圖像鍵入CV_32FC3標準化0和1之間的像素值

下面是我的代碼:

Mat image; 
    image = imread(imageLoc, CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYDEPTH); 

    Mat tempImage; 

    // (didn't work) tempImage *= 1./255; 

    image.convertTo(tempImage, CV_32F, 3); 
    normalize(image, tempImage, 0, 1, CV_MINMAX); 

    int r = 100; 
    int c = 150; 

    uchar* ptr = (uchar*)(tempImage.data + r * tempImage.step); 
    Vec3f tempVals; 
    tempVals.val[0] = ptr[3*c+1]; 
    tempVals.val[1] = ptr[3*c+2]; 
    tempVals.val[2] = ptr[3*c+3]; 
    cout<<" temp image - "<< tempVals << endl; 

    uchar* ptr2 = (uchar*)(image.data + r * image.step); 
    Vec3f imVals; 
    imVals.val[0] = ptr2[3*c+1]; 
    imVals.val[1] = ptr2[3*c+2]; 
    imVals.val[2] = ptr2[3*c+3]; 
    cout<<" image - "<< imVals << endl; 

這產生控制檯輸出如下:

temp image - [0, 0, 0] 
image - [90, 78, 60] 

回答

2

您可以convertTo()做正常化爲您提供:

image.convertTo(tempImage, CV_32FC3, 1.f/255); 

您正在通過3convertTo(),p可能是通道數,但這不是the correct signature

+0

這也產生一個整數輸出 – tjp

+0

你爲什麼這麼說?請嘗試使用'cv :: Mat :: at (row,col)'方法訪問像素。 –

+0

我輸出一些像素值到控制檯,試圖驗證轉換是否如我所願。使用(r,c)訪問值的方法給了我期望的結果。謝謝。 – tjp

0

我用了normalize功能和它的工作(JAVA):

Core.normalize(src,dst,0.0,1.0,Core.NORM_MINMAX,CvType.CV_32FC1); 

您應該使用32F深度的目標圖像。我相信原因是因爲你需要獲得十進制值,所以你應該使用非整數的OpenCV數據類型。根據這個table,浮點類型對應於32F深度。我選擇了1個頻道的數量, CV_32FC1

還請記住,它不可能發現圖像中的任何視覺差異。 最後,由於您的圖像中可能有數千個像素,因此您的控制檯可能看起來只打印了零。但由於數據量大,請嘗試使用CTRL+F來查看發生了什麼。希望這可以幫助。

+1

請[編輯]你的回答,以解釋爲什麼「你應該使用CV_32FC1類型」。 –

+0

爲什麼不float64? –

相關問題