2013-04-26 215 views
1

我正在處理一個圖像處理項目。我有一個灰度圖像和Canny邊緣檢測邊緣檢測。現在我想通過過濾不必要的邊來操縱結果。我想保持接近水平的邊緣並刪除接近垂直的邊緣。Matlab處理邊緣

如何刪除接近垂直邊緣?

+0

如何定義條件'接近垂直邊緣'? – 2013-04-26 13:49:00

+0

使用具有足夠寬度的垂直形狀結構元件的形態開口。像這樣:http://stackoverflow.com/a/11015774/97160 – Amro 2013-04-26 13:57:15

+0

@ArnoldVámos:發佈一個示例圖片,它會讓我們試驗 – Amro 2013-04-26 17:26:02

回答

2

這取決於如何允許成本密集。一個簡單的方法是:

(1)使用Sobel濾鏡(給出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

謝謝,這個作品真的很好! – 2013-04-29 12:47:27

3

一種選擇是使用Sobel operator的一半。完整的算法找到水平和垂直邊緣,然後將它們組合。你只對水平邊緣感興趣,所以只需計算該部分(這是維基百科文章中的Gy)。

您可能還想要將結果閾值設置爲黑白圖像而不是灰色陰影。

您可以將此技術應用於原始灰度圖像或Canny邊緣檢測的結果。