1. 程式人生 > >matlab邊緣檢測演算法彙總2

matlab邊緣檢測演算法彙總2

4.      基於小波變換模極大值的邊緣檢測

具體實現步驟如下:

1 對於原始影象進行二進離散平穩小波變換;

2 通過變化係數,得到影象的水平方向和垂直方向的小波變換系數,並計算器小波變換的模值和梯度方向;

3 求區域性模極大值。

clear all;
load wbarb;
I = ind2gray(X,map);imshow(I);
I1 = imadjust(I,stretchlim(I),[0,1]);figure;imshow(I1);
[N,M] = size(I);
 
h = [0.125,0.375,0.375,0.125];
g = [0.5,-0.5];
delta = [1,0,0];
 
J = 3;
 
a(1:N,1:M,1,1:J+1) = 0;
dx(1:N,1:M,1,1:J+1) = 0;
dy(1:N,1:M,1,1:J+1) = 0;
d(1:N,1:M,1,1:J+1) = 0;
 
a(:,:,1,1) = conv2(h,h,I,'same');
dx(:,:,1,1) = conv2(delta,g,I,'same');
dy(:,:,1,1) = conv2(g,delta,I,'same');
 
x = dx(:,:,1,1);
y = dy(:,:,1,1);
d(:,:,1,1) = sqrt(x.^2+y.^2);
I1 = imadjust(d(:,:,1,1),stretchlim(d(:,:,1,1)),[0 1]);figure;imshow(I1);
 
lh = length(h);
lg = length(g);
 
for j = 1:J+1
  lhj = 2^j*(lh-1)+1;
  lgj = 2^j*(lg-1)+1;
  hj(1:lhj)=0;
  gj(1:lgj)=0;
  for n = 1:lh
    hj(2^j*(n-1)+1)=h(n);
  end
 
  for n = 1:lg
    gj(2^j*(n-1)+1)=g(n);
  end
  
  a(:,:,1,j+1) = conv2(hj,hj,a(:,:,1,j),'same');
  dx(:,:,1,j+1) = conv2(delta,gj,a(:,:,1,j),'same');
  dy(:,:,1,j+1) = conv2(gj,delta,a(:,:,1,j),'same');
 
  x = dx(:,:,1,j+1);
  y = dy(:,:,1,j+1);
  dj(:,:,1,j+1) = sqrt(x.^2+y.^2);
 
  I1 = imadjust(dj(:,:,1,j+1),stretchlim(dj(:,:,1,j+1)),[0 1]);figure;imshow(I1);
end  

5.      基於二維有限的特定角度邊緣檢測

數字濾波器根據其衝擊響應函式的時域特性可分為兩類:IIR(無限長衝擊響應濾波器)和FIR(有限長衝擊響應濾波器)。運用與有限衝擊響應卷積核相同的原理,可以檢測任意角度的邊緣。

有限衝擊響應卷積核:

% 輸入影象,並將其轉化成灰度影象
I=imread('qipan.jpg');
I=rgb2gray(I);
% 構造卷積核

F2=[-1 -1 0 0 -1
     0 0 1 1 1];
% 進行卷積運算
A=conv2(double(I),double(F2));
% 轉換成8位無符號整型並顯示
A=uint8(A);
imshow(A)


檢測特定角度的邊緣:

% 輸入影象,並將其轉化成灰度影象
I=imread('qipan.jpg');
I=rgb2gray(I);
f=im2double(I);
choice = 0;
% 構造卷積核
H = [-1 -1 -1;2 2 2;-1 -1 -1];
V = [-1 2 -1;-1 2 -1;-1 2 -1];
 while(choice ~= 3)
     choice = input('1:Horizontal\n2:vertical\n3:Exit\nEnter your choice:');
     %根據不同的要求與不同的卷積核進行濾波
     switch choice
         case 1
             DH = imfilter(f,H);
             figure(2),imshow(f),title('原始影象');
             figure(3),imshow(DH),title('水平方向');
         case 2
             DV = imfilter(f,V);
             %figure(4),imshow(I),title('原始影象');
             figure(5),imshow(DV),title('垂直方向');
         case 3
             display('Program Exited');
         otherwise 
             display('Wrong choice!!!');
     end
 end
     
 

6.      基於多尺度形態學梯度的邊緣檢測

% 讀入並顯示原始影象
I=imread('**.jpg');
grayI=rgb2gray(I);
figure,imshow(grayI)

% 利用單尺度形態學梯度進行邊緣檢測
se=strel('square',3);
grad=imdilate(grayI,se)-imerode(grayI,se);
figure,imshow(grad)

% 利用多尺度形態學梯度進行邊緣檢測
se1=strel('square',1);
se2=strel('square',3);
se3=strel('square',5);
se4=strel('square',7);
grad1=imerode((imdilate(grayI,se2)-imerode(grayI,se2)),se1);
grad2=imerode((imdilate(grayI,se3)-imerode(grayI,se3)),se2);
grad3=imerode((imdilate(grayI,se4)-imerode(grayI,se4)),se3);
multiscaleGrad=(grad1+grad2+grad3)/3;
figure,imshow(multiscaleGrad)