共计 2756 个字符,预计需要花费 7 分钟才能阅读完成。
文章和代码以及样例图片等相干资源,曾经归档至【Github 仓库:digital-image-processing-matlab】或者公众号【AIShareLab】回复 数字图像处理 也可获取。
目标
1. 把握二维 DFT 变换及其物理意义
2. 把握二维 DFT 变换的 MATLAB 程序
3. 空域滤波与频域滤波
原理
1. 利用傅立叶变换进行图像处理
傅里叶变换是线性系统剖析的一个无力工具,它可能定量地剖析诸如数字化零碎、采样点、电子放大器、卷积滤波器、乐音和显示点等的作用。通过试验造就这项技能,将有助于解决大多数图像处理问题。对任何想在工作中无效利用数字图像处理技术的人来说,把工夫用在学习和把握博里叶变换上是很有必要的。
2. 傅立叶(Fourier)变换的定义
对于二维信号,二维 Fourier 变换定义为:
$$
F(u, v)=\int_{-\infty}^{\infty} \int_{-\infty}^{\infty} f(x, y) e^{-j 2 \pi (u x+vy)} d x d y
$$
逆变换:
$$
f(x, y)=\int_{-\infty}^{\infty} \int_{-\infty}^{\infty} F(u d, v) e^{j 2 \pi (u x+vy) } d u d v
$$
二维离散傅立叶变换为:
$$
F(u, v)=\sum_{x=0}^{M-1} \sum_{y=0}^{N-1} f(x, y) e^{-j 2 \pi\left(\frac{\mathrm{ux}}{\mathrm{M}}+\frac{v y}{N}\right)}
$$
逆变换:
$$
f(x, y)=\frac{1}{M N} \sum_{u=0}^{M-1} \sum_{v=0}^{N-1} F(u, v) e^{j 2 \pi\left(\frac{\mathrm{ux}}{M}+\frac{v y}{N}\right)}
$$
图像的傅立叶变换与一维信号的傅立叶变换变换一样,有疾速算法,具体参见参考书目,无关傅立叶变换的疾速算法的程序不难找到。实际上,当初有实现傅立叶变换的芯片,能够实时实现傅立叶变换。
利用 MATLAB 实现数字图像的傅立叶变换
A.
I=imread('D:\pic\DIP3E_CH03\Fig0316(3)(third_from_top).tif'); % 读入原图像文件 | |
imshow(I); % 显示原图像 | |
fftI=fft2(I); % 二维离散傅立叶变换 | |
sfftI=fftshift(fftI); % 直流重量移到频谱核心 | |
RR=real(sfftI); % 取傅立叶变换的实部 | |
II=imag(sfftI); % 取傅立叶变换的虚部 | |
A=sqrt(RR.^2+II.^2);% 计算频谱幅值 | |
A=(A-min(min(A)))/(max(max(A))-min(min(A)))*225; % 归一化 | |
figure % 设定窗口 | |
imshow(A); % 显示原图像的频谱 |
B.
傅立叶变换在图像处理,特地是在图像增强、还原和压缩中,扮演着十分重要的作用。理论中个别采纳一种叫做疾速傅立叶变换(FFT)的办法,MATLAB 中的 fft2 指令用于失去二维 FFT 的后果,ifft2 指令用于失去二维 FFT 逆变换的后果。
近似冲击函数的二维疾速傅立叶变换(FFT)
x=1:99;y=1:99; | |
[X,Y]=meshgrid(x,y); | |
A=zeros(99,99); | |
A(49:51,49:51)=1; | |
B=fft2(A); | |
subplot(1,2,1),imshow(A),xlabel('空域图象'); | |
subplot(1,2,2),imshow(B),xlabel('时域图象'); | |
figure | |
subplot(1,2,1),mesh(X,Y,A),xlabel('空域'),grid on; | |
subplot(1,2,2),mesh(X,Y,abs(B)),xlabel('时域'),grid on; |
空域滤波与频域滤波
% 用于频域滤波的 m 函数 | |
function g=dftfilt(f,H) | |
F=fft2(f,size(H,1),size(H,2)); | |
g=real(ifft2(H.*F)); | |
g=g(1:size(f,1),1:size(f,2)); | |
% | |
function PQ=paddedsize(AB,CD,PARAM) | |
if nargin==1 | |
PQ=2*AB; | |
elseif nargin ==2 & ~ischar(CD) | |
PQ=AB+CD-1; | |
PQ=2*ceil(PQ/2); | |
elseif nargin == 2 | |
m=max(AB); | |
P=2^nextpow2(2*m); | |
PQ=[P,P]; | |
elseif nargin == 3 | |
m=max([AB CD]); | |
P=2^nextpow2(2*m); | |
PQ=[P,P]; | |
else | |
error('Wrong number of inputs') | |
end | |
% 图像 f 的傅里叶频谱 | |
f=imread('D:\pic\DIP3E_CH04\Fig0438(a)(bld_600by600).tif'); | |
F=fft2(f); | |
S=fftshift(log(1+abs(F))); | |
%S=gscale(S); | |
% gscale 函数参照 function g=gscale(f,varargin) | |
imshow(S) | |
% 应用函数 fspecial 生成空间滤波器 | |
h=fspecial(‘sobel’) | |
freqz2(h) % 查看相应频域滤波器图形 | |
PQ=paddedsize(size(f)); | |
H=freqz2(h,PQ(1),PQ(2)); | |
H1=ifftshift(H); | |
imshow(abs(H),[]) | |
figure,imshow(abs(H1),[]) | |
gs=imfilter(double(f),h);% 生成滤波后的图像,并默认采纳了 0 进行边界填 | |
充 | |
gf=dftfilt(f,H1); | |
imshow(gs,[]) | |
figure,imshow(gf,[]) | |
figure,imshow(abs(gs),[]) | |
figure,imshow(abs(gf),[]) | |
% 创立一幅阀值 2 值图像 | |
figure,imshow(abs(gs)>0.2*abs(max(gs(:)))) | |
figure,imshow(abs(gf)>0.2*abs(max(gf(:)))) | |
d=abs(gs-gf); | |
max(d(:)) | |
min(d(:)) |
参考文献:
[1] Rafael C. Gonzalez, Richard E. Woods, and Steven L. Eddins. 2003. Digital Image Processing Using MATLAB. Prentice-Hall, Inc., USA.
[2] 阮秋琦. 数字图像处理(MATLAB 版)[M]. 北京:电子工业出版社, 2014..pdf)
[3] 冈萨雷斯. 数字图像处理(第三版)[M]. 北京:电子工业出版社, 2011..pdf)