2013-04-24 42 views
5

我有一個圖像,我試圖通過爲每個像素着色紅色綠色或藍色。我已經計算了每個像素的置信度分數,並且希望調整像素的alpha透明度以反映置信度,即低置信度意味着幾乎透明。有沒有辦法在OpenCV中做到這一點?如果沒有任何人可以建議一個微創庫(C++)?OpenCV:如何設置一個像素的Alpha透明度

我具有使用4通道8位Mat嘗試通過Aurellius所建議的,在這裏是代碼:

cv::Mat m = cv::Mat(20,20, CV_8UC4); 
    for(int i = 0; i < m.rows; i++){ 
     for(int j = 0; j < m.cols; j++){ 
      Vec4b& v = m.at<Vec4b>(i,j); 
      v[0] = 255; 
      v[1] = 0; 
      v[2] = 0; 
      v[3] = 0.5; 
     } 
    } 

    imwrite("alpha.png", m); 
    namedWindow("m"); 
    imshow("m", m); 
    waitKey(0); 

中所示的圖像只是所有藍色(無透明性)和圖像只是完全透明的。

回答

5

有很多方法可以做到這一點。一種可能的方式是訪問和修改每個單獨的像素。假設image是四信道,8位cv::Mat

auto& pixel = image.at<cv::Vec4b>(i,j); 
pixel[3] = confidence; 

i哪裏和j是圖像中的像素的索引。

還有其他方法可能更優雅,但它們將取決於您當前的代碼。

更新: 您描述的行爲是預期的。 Apparentlycv::imshow()不支持透明度。這解釋了爲什麼您的顯示圖像全是藍色。

至於保存的圖像,重要的是要記住,該圖像的類型爲CV_8UC4。這意味着每個通道元素都存儲爲uchar。分配0.5的值將截斷爲零,因此完全透明的已保存圖像。

如果您的置信度爲[0,1]範圍內的浮點值,請將其縮放255,以將其置於8位圖像支持的範圍內。因此,

v[3] = 0.5; 

成爲

v[3] = 0.5 * 255; 
+0

這似乎不工作,請參閱更新的問題 – Aly 2013-04-25 10:00:59

+0

@我剛纔試過這個答案,它的工作。 – Kiran 2015-03-28 07:58:41

3

我也有同樣的問題,但是當被繪製透明形狀和混合圖像解決它。 我源泉這個已經OpenCV的文檔

if you want to paint semi-transparent shapes, you can paint them in a separate buffer and then blend it with the main image. 

爲了這個目的,我建議你看一看this文檔的文章。希望這會有所幫助。