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
2:vertical
3:Exit
Enter 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)