2013-04-28 105 views
1


是否有任何函數或算法可以從圖像中刪除點和小/短行。我製作了機器人的公制地圖。我已經使用算法從圖像中創建一個骨架。我需要的是,刪除小/短線,並指出流暢的線條 - 請參閱picture。我是opencv的新手,所以也許這是一個簡單的問題。在opencv中刪除點和小行

有什麼建議嗎?謝謝。

爲了使骨骼我使用此代碼

#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "highgui.h" 
#include <stdlib.h> 
#include <stdio.h> 

using namespace cv; 

int main(int argc, char** argv) 
{ 

cv::Mat img = cv::imread("test4.png", 0); 

cv::Mat skel(img.size(), CV_8UC1, cv::Scalar(0)); 

cv::Mat temp(img.size(), CV_8UC1); 

cv::Mat sub_mat = Mat::ones(img.size(), img.type())*255; 

cv::Mat eroded; 

cv::Mat element = cv::getStructuringElement(cv::MORPH_CROSS, 

cv::Size(3, 3)); 

cv::subtract(sub_mat, img, img); 


bool done;  
do 
{ 
    cv::erode(img, eroded, element); 
    cv::dilate(eroded, temp, element); // temp = open(img) 
    cv::subtract(img, temp, temp); 
    cv::bitwise_or(skel, temp, skel); 
    eroded.copyTo(img); 

    done = (cv::countNonZero(img) == 0); 
} while (!done); 


cv::subtract(sub_mat, skel, skel); 

cv:imwrite("skelet.png",skel); 

cv::imshow("Skeleton", skel); 

cv::waitKey(0); 

return 0; 
} 
+0

你可能想嘗試一些過濾器的圖像。我猜中位數是一個很好的選擇。 – praks411 2013-04-28 10:37:06

回答

1

要刪除點,隔音一般,最簡單的方法是實施中值濾波器(基於像素的鄰域的中值濾波器)。

這裏是連接例如如何在C編程:

Mat median(Mat in) 
{ 
    int sizeW = 3;//Neighborhood size 
    int offset = sizeW/2; //external border of the image 
    if(in.channels()==3) cvtColor(in,in,CV_BGR2GRAY,1); 
    in.convertTo(in, CV_8UC1); 

    //Init 
    int x,y,i,j,k; 
    uchar temp; 
    uchar median[9] = {0};// the size of this matrix = sizeW² 
    int nRows = in.rows; 
    int nCols = in.cols; 
    Mat out = Mat::zeros(nRows-2*offset, nCols-2*offset, CV_8UC1); 


    //Processing 
    for(x=offset; x<nRows-offset; x++) 
     for(y=offset; y<nCols-offset; y++) 
    { 
     //Median 
     for(i=(-sizeW/2); i<=sizeW/2; i++) 
      for(j=(-sizeW/2); j<=sizeW/2; j++) 
       median[(i+sizeW/2)*sizeW + (j+sizeW/2)] = in.at<uchar>(x+i,y+j); 

     //Sort the median array 
     for(int z=0; z<sizeW*sizeW; z++) 
      for(k=1; k<sizeW*sizeW; k++){ 
       if(median[k-1]>median[k]){ 
        temp = median[k-1]; 
        median[k-1] = median[k]; 
        median[k] = temp; 
       } 
      } 
     out.at<uchar>(x-offset,y-offset) = median[(sizeW*sizeW/2)+1]; 
    }// for all pixels  

    return out; 
} 

你應該與所有的鄰居大小嚐試= 3