2013-04-26 3 views
1

저는 이미지 처리 프로젝트를 진행하고 있습니다. 나는 그레이 스케일 이미지를 가지고 있고 Canny edge detection으로 edge를 감지했다. 이제 불필요한 가장자리를 필터링하여 결과를 조작하고 싶습니다. 나는 수평에 가까운 가장자리를 유지하고 수직에 가까운 가장자리를 삭제하고 싶습니다.Matlab에서 가장자리를 조작합니다.

세로 모서리 가까이를 어떻게 삭제할 수 있습니까?

+0

'세로 가장자리에 가까운'조건을 어떻게 정의합니까? –

+0

은 적절한 너비의 수직 모양의 구조 요소가있는 형태학적인 개구부를 사용합니다. 뭔가가 좋아. http://stackoverflow.com/a/11015774/97160 – Amro

+0

@ ArnoldVámos : 샘플 이미지를 게시하면 실험을 할 수 있습니다. – Amro

답변

2

얼마나 비용이 많이 드는가에 따라 다릅니다. 쉬운 방법 중 하나는 다음과 같습니다.

(1) 이미지를 소벨 필터 (Dx, Dy 제공)로 콘볼 루션합니다.

(2) 정규화 (의 Dx, Dy가) s.t. 각 영리한-에지 화소

모든 픽셀에 가장자리의 방향이 있습니다.

(3) 제거하려는 방향 (귀하의 경우 (0,1))으로 내부 제품을 계산하십시오.

(4) 내부 제품의 절대 값이 어떤 임계 값보다 작은 경우 픽셀을 제거하십시오.

예 :

img = ...; 
canny_img = ...; 
removeDir = [0;1]; 
% convolute with sobel masks 
sobelX = [1, 0, -1; 2, 0, -2; 1, 0, -1]; 
sobelY = sobelX'; 
DxImg = conv2(img,sobelX,'same'); 
DyImg = conv2(img,sobelY,'same'); 
% for each canny-edge-pixel: 
for lin = 1:size(img,1) % <-> y 
    for col = 1:size(img,2) % <-> x 
     if canny_img(lin,col) 
      % normalize direction 
      normDir = [DxImg(lin,col); DyImg(lin,col)]; 
      normDir = normDir/norm(normDir,2); 
      % inner product 
      innerP = normDir' * removeDir; 
      % remove edge? 
      if abs(innerP) < cos(45/180*pi) % 45° threshold 
       canny_img(lin,col) = 0; 
      end 
     end 
    end 
end 

당신으로 인해 사용자의 요구 사항에 많은을 최적화 할 수 있습니다.

+0

고마워요, 이건 정말 잘됩니다! –

3

하나의 옵션은 Sobel operator의 절반을 사용하는 것입니다. 전체 알고리즘은 수평 및 수직 모서리를 찾아서 결합합니다. 수평 모서리에만 관심이 있기 때문에 해당 부분을 계산하면됩니다 (위키 백과 문서의 Gy).

결과를 임계 값으로 설정하여 회색 음영 대신 흑백 이미지를 얻을 수도 있습니다.

이 기법을 원래 회색조 이미지 또는 Canny 가장자리 감지 결과에 적용 할 수 있습니다.

관련 문제