本文將用matlab實現(xiàn)拉布拉斯算子提取邊緣,銳化圖像。分別采用空域和頻域兩種方法。
空域
步驟:
1.讀取圖像/(標定)
2.生成空間濾波器(fspecial('laplacian',0))
3.卷積(m = imfilter(f,w,'replicate'))
clear all;
f = imread('D:\moon.tif')
%a
figure(1)
imshow(f,[]);
title('a')
% b
w = fspecial('laplacian',0); %生成空間濾波器
m = imfilter(f,w,'replicate'); %'replicate'通過復制外邊界的值來擴展 默認相關
figure(2)
imshow(m,[]);
title('b')
%c
f2 = im2double(f); %標定,將負數(shù)變?yōu)?,有更好的銳化效果
n = imfilter(f2,w,'replicate');
figure(3)
imshow(n,[])
title('c')
%d
m1 = f - m;
figure(4)
imshow(m1,[]);
title('d')
%e
n1 = f2 - n;
figure(5)
imshow(n1,[]);
title('e')
頻域
步驟:
1.讀取圖像
2.補0,使圖像長、寬變?yōu)樵瓉韮杀?br>
3.將圖像移到補零后的中心
4.傅里葉變換
5.在頻域進行運算
6.傅里葉逆變換取實部
7.把圖像移回原來位置并取原來size的區(qū)域
%步驟1
clear all;
f = imread('D:\moon.tif')
f=double(f);
[m,n]=size(f);
%a
figure(1)
imshow(f,[]);
title('origin')
%步驟2
p=2*m;
q=2*n;
A=zeros(p,q);
for i=1:m
for j=1:n
A(i,j)=f(i,j);
end
end
%步驟3
for i=1:p
for j=1:q
A(i,j)=A(i,j)*(-1)^(i+j);
end
end
%步驟4
I2=fft2(A);
%步驟5
for i=1:p
for j=1:q
D(i,j)=sqrt((i-p/2)^2+(j-q/2)^2);
end
end
X=zeros(p,q);
%pi=3.14
for i=1:p
for j=1:q
X(i,j)=-4*pi^2*D(i,j)^2;
Y(i,j)=X(i,j)*I2(i,j);
end
end
%步驟6
gp3=real(ifft2(Y));
%步驟7
for i=1:p
for j=1:q
gp3(i,j)=gp3(i,j).*(-1).^(i+j);
end
end
figure(3);
imshow(gp3,[]);
%歸一化,目的是讓后面gs的第一項和第二項同一個數(shù)量級
gp3max = max(gp3(:));
g3 = gp3(1:m,1:n);
k=10; %k自己取,用來改變銳化項的比例
gs = f-k*g3/gp3max;
figure(2)
imshow(gs,[]),title('拉普拉斯銳化圖')