2012-10-10 23 views
0

我使用cv :: grabCut從圖像中提取對象。它運行良好。OpenCV將顏色設置爲前景標記像素GC_PR_FGD

現在我已經在單獨的墊沒有背景的對象,我想爲整個對象設置黑色。我想爲所有標有GC_PR_FGD(前景像素)的像素設置黑色。

我怎樣才能做到這一點?

謝謝!

回答

1

cv::grabCut documentation看來,你可以得到作爲輸出具有以下值的掩碼:

  • GC_BGD當然背景像素
  • GC_FGD當然前景(對象)像素
  • GC_PR_BGD可能的背景像素
  • GC_PR_FGD可能是一個前景像素

我是假設你想要一幅背景爲白色,前景爲黑色的圖像。在這種情況下,您可以創建一個新矩陣,並在遮罩像素循環時,根據遮罩像素值將0或1(或255)分配給該矩陣。

例如,假設你已經獲得了cv::Mat mask作爲算法的結果,這樣做(警告,我還沒有編制,它的近似值):

cv::Mat binaryImage = zeros(mask.rows, mask.cols, CV_8U); 

for (int i==0; i<mask.rows; ++i){ 
    for (int j==0; j<mask.cols; ++j){ 
     // choose pixels that are certainly or likely background 
     if (mask.at<uchar>(i,j) == GC_BGD || mask.at<uchar>(i,j) == GC_BGD){ 
      binaryImage.at<uchar>(i,j) = 255; 
     } 
    } 
} 
+0

嗨鮑勃,首先感謝回答快。我修改了一下你的代碼。我已經添加了binaryImage.at (i,j)= 255;在「如果」中,因爲你沒有寫(i,j),但代碼不起作用。在運行時間永遠不會輸入「如果」... – m4rkit0z

+0

嘿鮑勃!最後它的作品!在我做cv :: compare之前(output,cv :: GC_PR_FGD,output,cv :: CMP_EQ);將標誌GC_PR_FGD移除到每個像素。如果我評論這個操作,你的代碼工作!非常感謝鮑勃! – m4rkit0z

+0

@ m4rkit0z你說得對,我真的忘了循環裏面的'i'和'j'!馬上修復它。很高興幫助你 – Sassa