数字图像处理的MATLAB实现(3)
1.查看图像的频率谱和相位谱(一个例子)
I=imread('lichao.jpg');I=rgb2gray(I); subplot(2,3,1);imshow(I);title('原始图像'); F=fft2(I);S=abs(F); subplot(2,3,2);imshow(S,[]);title('图像的频谱图像'); Fc=fftshift(F); subplot(2,3,3);imshow(abs(Fc),[]);title('移频后的频谱图像'); s2=log(1+abs(Fc)); subplot(2,3,4);imshow(s2,[]);title('log增强后的频谱图'); r=real(F);i=imag(F); s1=log(1+abs(F));phase=angle(F)*180/pi; subplot(2,3,5);imshow(phase,[]);title('相位谱图'); r1=real(Fc);i1=imag(Fc); phase2=angle(Fc)*180/pi; subplot(2,3,6);imshow(phase2);title('位移后相位谱图'); %% 如果不对频率谱图像做log增强,得到的会几乎是全黑的图。因为二维傅里叶变换之后低频分量值非常大,那个地方才对应着白色,其他的高频分量相比之下都是非常小的值,因此如果显示出图像之后都是几乎全黑的。 %% 频率谱需要位移,将移到中间点 |
2.输入图片,输出图片频率谱的函数
% 从原始图像到频率谱(没有用log增强算子) function X = Frequency_Spectrum(A) X = fftshift(fft2(A)); end |
3.输入频率谱,输出频率谱所对应的原始图像的函数
% 从频率谱返回到原始图像(没有用log增强算子) function A = Inverse_Frequency_Spectrum(X) A = ifft2(fftshift(X)); end |
4.输入图片,输出图片的相位谱的函数
% 从原始图像到相位谱(用了log增强算子) function [s1,phase] = Image_Spectrum(A) F = fftshift(fft2(A)); r = real(F);i=imag(F); s1 = log(1+abs(F)); phase = angle(F)*180/pi; end |
5.一个小实验:频率谱和相位谱中,相位谱对图像本身的视觉影响更大(一个例子)
%% 读入图像(图像可以自己换) x = imread('lichao.jpg'); y = imread('yongjian.jpg'); %% 注意两幅图像的大小要相同 x = imresize(x,[500,500]); y = imresize(y,[500,500]); %% 傅里叶变换 xf=fft2(double(x)); yf=fft2(double(y)); %% 取幅度和相位 xf1=abs(xf);xf2=angle(xf); yf1=abs(yf);yf2=angle(yf); %% 画图 figure(1); subplot(2,4,1),imshow(x),title('源图像x'); subplot(2,4,2),imshow(xf1,[]),title('x图像频谱'); subplot(2,4,3),imshow(uint8(xf1),[]),title('x图像幅度谱'); subplot(2,4,4),imshow(xf2,[]),title('x图像相位谱'); subplot(2,4,5),imshow(y),title('源图像y'); subplot(2,4,6),imshow(yf1,[]),title('y图像频谱'); subplot(2,4,7),imshow(uint8(yf1),[]),title('y图像幅度谱'); subplot(2,4,8),imshow(yf2,[]),title('y图像相位谱'); %% 交换相位 xfr = xf1.*cos(yf2)+xf1.*sin(yf2).*i; yfr = yf1.*cos(xf2)+yf1.*sin(xf2).*i; %% 傅里叶反变换 xr=abs(ifft2(xfr)); yr=abs(ifft2(yfr)); %% 显示 figure(2);subplot(2,2,1);imshow(x);title('x原图'); subplot(2,2,2);imshow(y);title('y原图'); subplot(2,2,3);imshow(uint8(xr),[]);title('x 幅度谱与y相位谱'); subplot(2,2,4);imshow(uint8(yr),[]);title('y 幅度谱与x相位谱'); |
运行结果(两张图片的频率谱、幅度谱和相位谱): |
一个图像中的幅度谱和另一个图像中的相位谱叠加: |
6.理想低通滤波器的函数实现
function E = ILP(A,banjing) [u_max,v_max] = size(A); U=0:u_max-1;V=0:v_max-1;% 定义坐标的范围 center_u = ceil(u_max/2);center_v = ceil(v_max/2);% 计算中心的坐标 HL=zeros(u_max, v_max);% 初始化 for u=1:u_max for v=1:v_max dist = sqrt((U(u) - center_u)^2 + (V(v) - center_v)^2); HL(u,v) = dist < banjing; end end B = fftshift(fft2(A)); D = B .* HL; E = uint8(ifft2(fftshift(D))); end |
7.理想低通滤波器的图像低通滤波运行效果