2013-07-15 54 views
1

我一直在做一些與opencv和圖像處理工作。每過一段時間我碰到的地方,當我嘗試做手工喜歡這裏的一些像素的修改情況:像素修改不包括整個圖像

cv::Mat newImg = cv::Mat::zeros(img.size(), img.type()); 

    for(int y = 0; y < img.rows; y++) 
    { 
     for(int x = 0; x < img.cols; x++) 
     { 
      cv::Vec3b intensity = img.at<cv::Vec3b>(y, x); 
      r = intensity.val[0]; 
      g = intensity.val[1]; 
      b = intensity.val[2]; 

      intensity.val[0] = r - (r * modify - r); 
      intensity.val[1] = g - (g * modify - g); 
      intensity.val[2] = b - (b * modify - b); 

      newImg.at<cv::Vec3b>(y, x) = intensity; 
     } 
    } 

這將產生具有一個黑盒子,像這樣

enter image description here

新形象

現在我只是不明白爲什麼for循環不包括整個照片,我之前設法解決這個問題,但純粹的運氣,仍然不明白爲什麼和這個問題來自哪裏。

所以我的問題簡而言之就是:如何從我的圖像中刪除這個黑盒子?

感謝

+1

我認爲黑色區域發生是因爲您在循環中切換了行/列。 – Diana

+1

看起來很有可能,因爲非黑色區域的高度與寬度相同。嘗試更改x和y。 – Totoro

回答

5

這個問題的最常見的原因是,你用了錯誤的元素類型訪問圖像。您使用.at<cv::Vec3b>(y,x)進行像素訪問。這假定圖像只有BGR通道。您的圖片數據可能採用BGRA格式,尤其是因爲這是iOS的原生圖片格式。

要解決您的問題,請將cv::Vec3b的所有實例更改爲cv::Vec4b,並且代碼應正常工作。

+0

可能是一個alpha通道? 480/640 = 3/4:你似乎在這裏的東西 –

+0

太棒了!這似乎已經完成了技巧,但問題是:可以肯定地說'intensity.val [3]'將包含該像素的Alpha通道數據? –

+1

就是這樣。 – Aurelius