0
我使用cv :: grabCut從圖像中提取對象。它運行良好。OpenCV將顏色設置爲前景標記像素GC_PR_FGD
現在我已經在單獨的墊沒有背景的對象,我想爲整個對象設置黑色。我想爲所有標有GC_PR_FGD(前景像素)的像素設置黑色。
我怎樣才能做到這一點?
謝謝!
我使用cv :: grabCut從圖像中提取對象。它運行良好。OpenCV將顏色設置爲前景標記像素GC_PR_FGD
現在我已經在單獨的墊沒有背景的對象,我想爲整個對象設置黑色。我想爲所有標有GC_PR_FGD(前景像素)的像素設置黑色。
我怎樣才能做到這一點?
謝謝!
從cv::grabCut documentation看來,你可以得到作爲輸出具有以下值的掩碼:
我是假設你想要一幅背景爲白色,前景爲黑色的圖像。在這種情況下,您可以創建一個新矩陣,並在遮罩像素循環時,根據遮罩像素值將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;
}
}
}
嗨鮑勃,首先感謝回答快。我修改了一下你的代碼。我已經添加了binaryImage.at(i,j)= 255;在「如果」中,因爲你沒有寫(i,j),但代碼不起作用。在運行時間永遠不會輸入「如果」... –
m4rkit0z
嘿鮑勃!最後它的作品!在我做cv :: compare之前(output,cv :: GC_PR_FGD,output,cv :: CMP_EQ);將標誌GC_PR_FGD移除到每個像素。如果我評論這個操作,你的代碼工作!非常感謝鮑勃! – m4rkit0z
@ m4rkit0z你說得對,我真的忘了循環裏面的'i'和'j'!馬上修復它。很高興幫助你 – Sassa