2012-04-02 25 views
7

Tôi đang cố gắng thực hiện dò tìm cạnh khó mà không cần gọi chức năng canny trong Matlab. Tôi đã viết một vài chức năng cho bộ lọc gaussian (sigma = 1) và không loại bỏ tối đa. Hình ảnh gốc và ảnh kết quả được hiển thị .. Không chắc gì lỗi ...Máy dò cạnh cận cảnh trong MATLAB

ảnh gốc là

enter image description here

Kết quả tôi nhận được là

enter image description here

Tôi đã đính kèm mã:

%% Read in 
I = imread('fruit.jpg'); 
figure(1),imshow(I) 
I = double(I); 
%% Determine Mask Size 
sigma = 2; 
w = mask_size(sigma); 
%% Gaussian Smoothing Filter 
[ G,sum ] = gauss_mask(w,sigma); 
%% Convolve 
I1 = (1/sum) * image_convolution(I,w,G); 
figure(2),imshow(I1); 
%% Ix(derivative in x-direction) 
Ix= delx(I1); 
figure(3),imshow(Ix); 
%% Iy(derivative in y-direction) 
Iy= dely(I1); 
figure(4),imshow(Iy); 
%% Gradient Magnitude 
If = grad_mag(Ix,Iy); 
figure(5),imshow(If); 
%% Non-maxmimum suppression 
It = suppression(If,abs(Ix),abs(Iy)); 
figure(6),imshow(It); 



function [ G,sum ] = gauss_mask(w,sigma) 
min = 1; 
m = floor(w/2); 
sum = 0; 
for x = 1: w 
    for y = 1:w 
     g = x-m-1; 
     h = y-m-1; 
     k = -(g^2 +h^2)/(2*sigma^2); 
     G(x,y) = exp(k); 
     sum = sum + G(x,y); 
     if min > G(x,y) 
      min = G(x,y); 
     end 
    end 
end 
B=1/min; 
G= B * G; 
G = round(G); 
end 


function [ I2 ] = image_convolution(I,w,G) 
m= (w-1)/2; 
N= size(I,1); 
M=size(I,2); 
for i=1:N 
    for j=1:M 
     if (i > N-m-1 || j > M-m-1 || i<m+1 || j <m+1) 
      I2(i,j) = 0; 
      continue; 
     end 
     sum1 = 0; 
     for u=1:w 
      for v=1:w 
       sum1 = sum1+I(i+u-m-1,j+v-m-1)*G(u,v); 
      end 
     end 
     I2(i,j)=sum1; 
    end 
end 
end 


function [ Ix ] = delx(image) 
mask = [-1 0 1; -2 0 2; -1 0 1]; 
Ix =image_convolution(image,3,mask); 
end 

function [ Iy ] = dely(image) 
mask = [-1 -2 -1;0 0 0;1 2 1]; 
Iy =image_convolution(image,3,mask); 
end 

function [ Imag ] = grad_mag(Ix,Iy) 
m=size(Ix,1); 
n=size(Ix,2); 
for i=1:m 
    for j=1:n 
      Imag(i,j) =sqrt(Ix(i,j)^2 + Iy(i,j)^2); 
    end 
end 
end 

function [ It ] = suppression(If,Ix,Iy) 
m=size(Ix,1); 
n=size(Ix,2); 
for i = 1:m 
    for j=1:n 
      if (j == 1 || j == n || i == 1 || j == n) 
       It(i,j) = 0; 
      else if (Ix(i,j)*Iy(i,j)> 0) 
       f1 =If(i-1,j-1); 
       f2 =If(i,j); 
       f3 =If(i+1,j+1); 
       It(i,j) = thinning(f1,f2,f3); 
       else if(Ix(i,j)*Iy(i,j)< 0) 
        f1 =If(i+1,j-1); 
        f2 =If(i,j); 
        f3 =If(i-1,j+1); 
        It(i,j) = thinning(f1,f2,f3); 
        else if(abs(Ix(i,j))-abs(Iy(i,j))>5) 
          f1 =If(i-1,j); 
          f2 =If(i,j); 
          f3 =If(i+1,j); 
          It(i,j) = thinning(f1,f2,f3); 
          else if(abs(Iy(i,j))-abs(Ix(i,j)) > 5) 
           f1 =If(i,j-1); 
           f2 =If(i,j); 
           f3 =If(i,j+1); 
           It(i,j) = thinning(f1,f2,f3); 
           end 
         end 
        end 
       end 
      end 
    end 
end 

end 

function [ w ] = thinning(f1,f2,f3) 
if(f2>f1 && f2>f3) 
    w =1; 
else 
    w= 0; 
end 
end 

function sz = mask_size(sigma) 
sz = floor(6*sigma) + 1; 
end 

Có rất nhiều tiếng ồn ... làm thế nào tôi có thể giải quyết được lỗi? tôi cần một số giúp đỡ ....

+0

Bạn có nhận được kết quả tương tự với giá trị sigma cao hơn không? Ngoài ra, chức năng 'mask_size' của bạn hoạt động như thế nào? Bạn nên sử dụng kích thước mặt nạ (6 * sigma + 1). –

+0

Ngưỡng của bạn ở đâu? bạn cần ngưỡng thấp và cao – hmfarimani

Trả lời

4

Lỗi thực sự là ở chức năng mỏng.

if(f2>f1 && f2>f3) 
     w =f2; 
    else  
     w= 0; 
3

Bạn nên làm cả hai:

  1. Smooth hình ảnh để loại bỏ tiếng ồn (conv with a gaussian matrix) trước khi làm bất cứ thao tác trên đó.
  2. Hãy ngưỡng cao hơn trong Hysteresis một phần của thuật toán:

Hãy T1 lớn hơn khi bạn làm điều này một phần của thuật toán:

Define two thresholds T1 > T2 

for every pixel with value greater than T1 is presumed to be an edge pixel. 
+0

tôi đã làm mịn hình ảnh với ma trận gaussian ... làm thế nào để u làm phần hystersis? làm điều đó trước khi loại bỏ tối đa hoặc sau? – lakesh

+0

Đã thêm một liên kết đến trễ, hy vọng là đủ – 0x90

+0

không áp đảo tối đa luôn được thực hiện trước – vini

0

Vấn đề của bạn ở lúc làm móng thêm một bàn dập mạnh để loại bỏ các cạnh giả.

Trước tiên, bạn phải làm mịn hình ảnh bằng chức năng Gaussian. Sau đó tìm gradient và độ lớn của hình ảnh đầu vào. Thực hiện triệt tiêu nonmaxima. Sau đó làm heshesis thresholding.

0

Thấy Cạnh hình ảnh đầu ra của bạn, tôi có thể nói rằng Bạn nên kiểm tra ..

  1. trễ Chức năng hoạt động tốt hay không
  2. Bạn có thể mất CAO ngưỡng chút cao
  3. bạn có thể mịn ảnh hơn chút.