MATLAB实现图像变换和滤波方法对具有不同特征的灰度图像进行处理
图像变换方法包括:DFT及IDFT,DCT及IDCT
图像滤波方法包括低通滤波和高通滤波
图像变换
DFT/IDFT
图像一般是二维的,根据二维离散傅里叶变换公式DFT,可以将图片从空间域转换到频率域内,对其进行一些处理,再通过离散傅里叶反变换IDFT,转换回原空间域,达到一些特殊处理效果。
DCT/IDCT
离散余弦变换(Discrete Cosine Transform)本质上也是离散傅里叶变换(Discrete Fourier Transform),但是只有实数部分。有这样一个性质:如果信号x[n]在给定区间内满足狄利赫里条件,且为实对称函数,则可以展开成仅含有余弦项的傅里叶级数,即离散余弦变换。所以,我们在构造离散信号的周期函数的时候,要对其进行偶延拓。
图像滤波
图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。常见的滤波方法有低通滤波和高通滤波。
图像是一个二维的信号,其中像素点灰度值的高低代表信号的强弱。图像中的高频是指图像中灰度变化剧烈的点,一般是图像轮廓或者是噪声;图像中的低频是指图像中平坦的,灰度变化不大的点,图像中的大部分区域。
根据图像的高频与低频特征,我们可以设计相应的高通与低通滤波器,高通滤波可以检测图像中尖锐、变化明显的地方;低通滤波可以让图像变得光滑,滤除图像中的噪声。
MATLAB代码实现
% 1.读取图片
x=imread('.\BMP_images\lena256.BMP');
y=imread('.\BMP_images\cman256.BMP');% 2.将两图分别转换成灰度图像
% x=rgb2gray(x);
% y=rgb2gray(y);% 3.FFT变换,并将中心平移
dftxchange = fftshift(fft2(x));
dftychange = fftshift(fft2(y));% 4.将平移后矩阵取实部,显示频谱图在窗口中。使用angle函数求相位角,显示相位图
figure(1)
subplot(1,2,1);imshow(x);title('原图1');
subplot(1,2,2);imshow(y);title('原图2');
figure(2)
subplot(2,2,1);imshow(log(abs(dftxchange)),[8 10]);title('图1的DFT频谱图');
subplot(2,2,3);imshow(angle(dftxchange));title('图1的DFT相位图');
subplot(2,2,2);imshow(log(abs(dftychange)),[8 10]);title('图2的DFT频谱图');
subplot(2,2,4);imshow(angle(dftychange));title('图2的DFT相位图');% 5.DCT变换
dcta=dct2(x);
dctb=dct2(y); % 6.显示频谱图和相位图
figure(3)
subplot(2,2,1);imshow(log(abs(dcta)),[]);title('图1的DCT变换幅度图');
subplot(2,2,2);imshow(angle(dcta),[]);title('图1的DCT变换相位图');
subplot(2,2,3);imshow(log(abs(dctb)),[]);title('图2的DCT变换幅度图');
subplot(2,2,4);imshow(angle(dctb),[]);title('图2的DCT变换相位图'); % 7.对图1和图2的频谱图和相位图分别进行IDFT重建,对图1(图2)的频谱图和图2(图1)的频谱图、相位图分别进行IDFT重建,显示重建后图片。
A=fft2(double(x)); B=fft2(double(y));
Af=abs(A); phaseA=angle(A);
Bf=abs(B); phaseB=angle(B);rA=Af.*cos(phaseA)+Af.*sin(phaseA).*1i;
rB=Bf.*cos(phaseB)+Bf.*sin(phaseB).*1i;
xchange=uint8(abs(ifft2(rA)));
ychange=uint8(abs(ifft2(rB)));
figure(4);
subplot(2,1,1);imshow(xchange,[]);title('图1的幅度和1相位DFT重建');
subplot(2,1,2);imshow(ychange,[]);title('图2的幅度和2相位DFT重建');% % 8.对图1和图2的频谱图和相位图分别进行IDFT重建,对图1(图2)的频谱图和图2(图1)的频谱图、相位图分别进行IDFT重建,显示重建后图片。
% rab0=Af.*cos(phaseB)+Af.*sin(phaseB).*1i;
% rab1=Bf.*cos(phaseA)+Bf.*sin(phaseA).*1i;
% xy=uint8(abs(ifft2(rab0)));
% xy1=uint8(abs(ifft2(rab1)));
% subplot(2,2,2);imshow(xy,[]);title('图1幅谱与2相谱IDFT重建');
% subplot(2,2,4);imshow(xy1,[]);title('图2幅谱与1相谱IDFT重建');% 7.对图1和图2的频谱图和相位图分别进行IDCT重建,对图1(图2)的频谱图和图2(图1)的频谱图、相位图分别进行IDCT重建,显示重建后图片。
dctxchange1=abs(dcta);dctxap=angle(dcta);
dctyychange2=abs(dctb);dctybp=angle(dctb);
dctxxchange4=dctxchange1.*cos(dctxap)+dctxchange1.*sin(dctxap).*1i;
dctyychange5=dctyychange2.*cos(dctybp)+dctyychange2.*sin(dctybp).*1i;
dctxxchange4=uint8(abs(idct2(dctxxchange4)));
dctyychange5=uint8(abs(idct2(dctyychange5)));
figure(5)
subplot(2,1,1);imshow(dctxxchange4,[]);title('图1幅度与1相位IDCT重建');
subplot(2,1,2);imshow(dctyychange5,[]);title('图2幅度与2相位IDCT重建');
% dctxxchange4=dctxchange1.*cos(dctybp)+dctxchange1.*sin(dctybp).*1i;
% dctyychange5=dctyychange2.*cos(dctxap)+dctyychange2.*sin(dctxap).*1i;
% dctxchanger1=uint8(abs(idct2(dctxxchange4)));
% dctychanger1=uint8(abs(idct2(dctyychange5)));
% subplot(2,2,2);imshow(dctxchanger1,[]);title('图1幅度与2相位IDCT重建');
% subplot(2,2,4);imshow(dctychanger1,[]);title('图2幅度与1相位IDCT重建');
更多详细代码发布在https://github.com/JeremyChou28/digital_image_processing/tree/main/project1