2013-04-28 2 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

답변

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