2014-02-06 26 views
0

我有一個二進制圖像。 ,我想填充它的一部分完全黑色,並保持白色。 我想要什麼可以在這裏最好的解釋 - http://www.roborealm.com/tutorial/Obstacle_Avoidance/slide020.php 解釋 - 我從右下角開始,到達左上角。如果我找到任何非黑色像素,則具有Y座標小於它並具有相同X座標的所有像素將變爲黑色。這通過從圖像的底部開始並逐個像素地填充每個空白黑色像素直到非空黑色像素被看到。然後填充停止那個垂直列並繼續下一個。如何在opencv中填充二進制圖像的一面?

我在opencv中爲它寫了一段代碼。 我只提到該特定部分的代碼。

for (int j =dst.cols; j>=0; j--) { 
    for (int i =dst.rows; i>=0; i--) { 
     if (dst.at<char>(i,j) == 0){ 
      dst.at<char>(i,j)=255; 
     } 
     if (dst.at<char>(i,j)>0){ 
      for (int k =i; k>=0; k--) { 
       dst.at<char>(k,j)=0; 
      } 
     } 
    } 
} 

但它不工作,但它顯示分段故障(核心轉儲)。

回答

1

試試這個(未測試): (使用different testunsigned char代替char

for (int j =dst.cols-1; j>=0; j--) 
{ 
    bool white = true; 
    for (int i =dst.rows-1; i>=0; i--) 
    { 
     if (dst.at<unsigned char>(i,j) > 0) 
     { 
      white = false; 
     } 
     if(white) 
      dst.at<unsigned char>(i,j)=255; 
     else 
      dst.at<unsigned char>(i,j)=0; 

    } 
} 

編輯:增加了一個> 0而不是== 255來檢查二進制條件是否成立。

+0

謝謝你這麼多。我能知道我錯在哪裏嗎?謝謝。 – Shubham

+0

它的工作。謝謝。 – Shubham

+0

我看到兩個可能的問題:1.對'char'而不是'unsigned char'進行測試,你將不會找到'255'值,並且2.你必須設置值'i = 0;'在找到' > 0'值,否則內部for循環會再次覆蓋您的結果。 – Micka

2

應該是:

for (int j =dst.cols-1; j>=0; j--) { 
for (int i =dst.rows-1; i>=0; i--) { 

UPD:我想這應該是更快:

#pragma once 
#include <string> 
#include <iostream> 
#include <vector> 
#include "opencv2/opencv.hpp" 
using namespace std; 
using namespace cv; 
//---------------------------------------------------------- 
// MAIN 
//---------------------------------------------------------- 
int main(int argc, char* argv[]) 
{ 
    // src image 
    Mat src; 
    // dst image 
    Mat dst; 
    // Image loading 
    namedWindow("result"); 
    namedWindow("src"); 
    src=imread("d:\\ImagesForTest\\obstacle_scene_1_edge.jpg",0); 
    dst=Mat::zeros(src.size(),CV_8UC1); 
    for (int i=0;i<src.cols;++i) 
    { 
     int j=src.rows-1; 
     for (j=src.rows-1;j>0;--j) 
     { 
      if(src.at<uchar>(j,i)>0) 
      {   
       break; 
      } 
     } 
     dst(Range(j,dst.rows-1),Range(i,i+1))=255; 
    } 
    imshow("src",src); 
    imshow("result",dst); 
    //---------------------------------------------------------- 
    // Wait key press 
    //---------------------------------------------------------- 
    waitKey(0); 
    destroyAllWindows(); 
    return 0; 
} 
+0

讓我試試,謝謝。 – Shubham

+0

它再次顯示完全白色圖像。 – Shubham

+0

等幾分鐘我會檢查代碼。 –

0

我指的是相同的論文/網站。但我正在使用MATLAB。

%循環函數從下到上填充圖像 [rows,columns] = size(Binary Image);

對於j = 1:150; %列數 (i = 1:100;行的%數

%查找白色像素從(LASTROW,firstColumns)

如果 Find_white_pixel =查找(二值圖像== 0,1, '第一')開始; new_pixel = imfill(Binary Image,i,j)== 0; %填充像素直至無缺的像素被認爲是

else 
     [rows, columns-1]=0; 
      new_pixel=imfill (Binary Image,i++,j)==1; 

末 結束 結束

但它的錯誤我指編碼申報的行和列

+0

如果您有新問題,請點擊[Ask Question](http://stackoverflow.com/questions/ask)按鈕;您可能希望在上下文中包含此鏈接。或者,您可以將此問題列爲最受歡迎,以獲得任何新答案的通知。一旦你有足夠的聲望,[你也可以高調](http://stackoverflow.com/privileges/vote-up),或者[添加賞金](http://stackoverflow.com/privileges/set-bounties)吸引更多的關注。 –