2013-11-04 32 views
0

對C++來說相當新穎,我一直在使用OpenCV庫。我正在嘗試爲圖像查看器創建調光功能。這是void dim(int val)的主體。使用OpenCV修改圖像時出現錯誤的RGB值

我的每一個像素上循環,舒筋Vec3b內的像素的RGB值的參考,然後通過一些變化的因素減少他們,從val/255(其中0 <= val <= 255計算,但由於某些原因,pix[0]等都是被

但我看不出它是什麼;設置爲0,這意味着對於任何 val值的圖像變爲黑色

可能會做一些與浮點這裏,或誤解的OpenCV的某些方面稍微愚蠢的。

for(int x = 0; x < rows; x++) { 
    for(int y = 0; y < cols; y++) { 
     Vec3b &pix = dst.at<Vec3b>(x,y); 

     float change = val/255.0f; 
     pix[0] = (uchar)(pix[0] * change); 
     pix[1] = (uchar)(pix[1] * change); 
     pix[2] = (uchar)(pix[2] * change); 
    } 
} 

在此先感謝!

+0

我測試你的代碼,它工作正常!不要將'val'設置得太小,否則結果'dst'會變成全黑。 – WangYudong

+1

你可以做'dst * = val/255.0f'。此外,它看起來像你有你的指數錯誤。你應該有'x

+0

在這個速記上歡呼聲。我不明白指數是如何錯誤的,但當前的配置工作正常,如果我切換變量,它只會使圖像的一部分變暗。 –

回答

1

OpenCV有一個關於changing the contrast and brightness of an image的文檔。一般來說,它將alpha * pixel_value + beta應用於每個像素。由於您只需要調整圖像的亮度,因此可以設置alpha1.0。這裏是修改的dim()函數。

// negative beta dims image 
void dim(Mat& src, Mat& dst, int beta) { 
    for(int y = 0; y < src.rows; y++) { 
     for(int x = 0; x < src.cols; x++) { 
      for(int channel = 0; channel < 3; channel++) { 
       dst.at<Vec3b>(y, x)[channel] = saturate_cast<uchar>(src.at<Vec3b>(y, x)[channel] + beta); 
      } 
     } 
    } 
} 

閱讀什麼saturate_cast如果感興趣的話。

爲了測試上面的函數:

int main(int argc, char** argv) 
{ 
    int beta; 
    Mat src = imread(...); 
    Mat dst = Mat::zeros(src.size(), src.type()); 
    namedWindow("src", CV_WINDOW_AUTOSIZE); 
    imshow("src", src); 
    dim(src, dst, -200); 
    namedWindow("dst", CV_WINDOW_AUTOSIZE); 
    imshow("dst", dst); 

    waitKey(0); 
    return 0; 
} 
0

如果您將整數值乘以小於1的實數值,您將得到0,因爲您的縮放係數將被截斷爲整數。 要糾正你的問題,你應該將pix []轉換爲float或double來縮放它,並將結果轉換回char。

+0

我試圖將每個pix []值浮動,但沒有區別。 –