实验二 数字图像变换
一、实验目的
1、了解图像变换的意义和手段 2、熟悉傅立叶变换的基本性质 3、熟练掌握FFT变换方法及应用 4、通过实验了解二维频谱的分布特点 5、掌握图片的压缩技术原理
二、实验原理
1、 应用傅立叶变换进行图像处理
傅里叶变换是线性系统分析的一个有力工具,它能够定量地分析诸如数字化系统、采样点、电子放大器、卷积滤波器、噪音和显示点等的作用。通过实验培养这项技能,将有助于解决大多数图像处理问题。对任何想在工作中有效应用数字图像处理技术的人来说,把时间用在学习和掌握博里叶变换上是很有必要的。
离散傅里叶变换具有许多重要的性质,这些性质为实际运算提供了极大的方便。例如,根据变换核的可分离性,二维离散傅里叶变换可以通过两次一维离散傅里叶变换来实现;根据周期性,只需要一个周期就可以将整个变换完全确定;根据共轭对称性,只需要半个周期的变换就可以获得整个频谱。
图像傅里叶变换是将图像从图形的空间变换到频率空间,从而可利用傅里叶频谱特性进行图像处理,使运算变得简单。 2、 傅立叶(Fourier)变换的定义
对于二维信号,二维Fourier变换定义为:
??F(u,v)?逆变换:
??????f(x,y)e?j2?(ux?uy)dxdy
??f(x,y)?二维离散傅立叶变换为:
??????F(u,v)ej2?(ux?uy)dudv
ik?j2?(m?n)1N?1N?1NN F(m,n)???f(i,k)eNi?0k?0逆变换:
1f(i,k)?Nm?0n?0??F(m,n)eN?1N?1j2?(mik?n)NN
图像的傅立叶变换与一维信号的傅立叶变换变换一样,有快速算法,具体参见参考书目,有关傅立叶变换的快速算法的程序不难找到。实际上,现在有实现傅立叶变换的芯片,可以实时实现傅立叶变换。 3、离散傅里叶变换
计算机处理傅立叶变换用离散傅立叶变换,输入/输出数据均为离散,便于计算机处理。在使用离散傅立叶变换时,可以使用其快速算法FFT。
MATLAB提供的相关函数:FFT、FFT2、FFTn。
对二值图像进行傅里叶变换以后观察其频谱,我们会发现直流成分主要集中在右上角,分辨率比较低。所以必须通过fftshift函数提供补零和直流成分显示区域调整后得到调整,再进行观察。 4、离散余弦变换
使用傅立叶变换时存在一个问题,它的参数均为复数,数据描述上相当于实数的两倍,也就是说数据的计算量比较大,而离散余弦变换较好的解决了这个问题。离散余弦变换,根据实的偶函数的离散傅里叶变换只包含余弦项(实部)的特性,可将实图像构造成实的偶函数,再求它的离散傅里叶变换,从而构成所谓的离散余弦变换(DCT)。它是实的正交变换,变换核可分离且具有对称性,可以通过傅里叶变换的实部求得,所以具有快速算法。DCT变换具有良好的信息压缩能力,因而在图像的压缩编码等领域具有广泛的应用。
离散余弦的MATLAB实现一种是基于图像离散余弦变换的算法,这是通过MATLAB工具箱提供的dct2 函数和idct2函数实现的;另一种是DCT变换矩阵方法。变换矩阵方法非常适合做8*8 或16*16 的图像块的DCT 变换,工具箱提供了dctmtx 函数来计算变换矩阵。
离散余弦变换具有很强的“能量集中”特性,而且能量主要集中在左上角处,因此在实际图像应用中,能量不集中的地方可在余弦编码中忽略。于是我们可以通过对mask矩阵进行变换来实现,即将mask矩阵左上角置1,其余全部置0。然后通过离散余弦反变换后,图像得以恢复,这种处理方法叫做图像的压缩。 5、沃尔什变换
由于傅里叶变换和余弦变换的变换核由正弦、余弦函数组成,运算速度受影响。在特定问题中,往往引进不同的变换方法,以求运算简单且变换核矩阵产生方便。沃尔什变换中的变换矩阵简单(只有1和-1),占用存储空间少,产生容易,有快速算法,所以在需要实时处理大量数据的图像处理问题中,应用广泛。 6、图像的压缩
离散余弦变换是先将整体图像分成N×N像素块,然后对N×N像素块逐一进行离散余弦变换。由于大多数图像的高频分量较小,相应于图像高频分量的系数经常为零,加上人眼对高频成分的失真不太敏感,所以可以用更粗的量化。这样起到压缩图像的目的,使传输的数码率要远远小于实际图像的数码率,接收端通过反变换得到的恢复图像也不会有明显的改变。图像压缩主要任务是取不同的DCT系数,观察即满足不影响图像质量有能达到较大的压缩率。
对图像进行分块处理时,我们会用到函数blkproc( ) 。 调用格式:
B=blkproc(A,[m n],fun, parameter1, parameter2, ...) B=blkproc(A,[m n],[mborder nborder],fun,...) B=blkproc(A,'indexed',...) 参数说明:
[m n]:图像以m*n为分块单位,对图像进行处理(如8*8) Fun:应用此函数对分别对每个m*n分块的像素进行处理 parameter1, parameter2: 要传给fun函数的参数
mborder nborder:对每个m*n块,上下进行mborder个单位的扩充,左右进行nborder个单位的扩充,扩充的像素值为0,fun函数对整个扩充后的分块进行处理。
这里:fun='P1*x*P2',fun的参数P1,P2,将T,T'传递给fun的参数,即:P1=T,P2=T'。
三、实验例题
1、有一矩形函数f(m,n),矩形区域为1,其余为0,对该矩形作傅立叶变换。 clear; N=100; f=zeros(50,50); f(15:35,23:28)=1; subplot(2,1,1) imshow(f) subplot(2,1,2) F=fft2(f);
imshow(log(abs(F)))
2、fftshift函数实现补零操作和改变图象显示象限 N=100; f=zeros(50,50); f(15:35,23:28)=1; subplot(2,1,1) imshow(f) F=fft2(f,256,256); F2=fftshift(F); subplot(2,1,2) imshow(log(abs(F2)));
3、对图像进行离散余弦变化,观察其余弦变换系数及余弦反变换后恢复图像。 ⑴ 将变换后小于10的元素忽略
I = imread('cameraman.tif') ; %装入原始图像 subplot(3,1,1); imshow(I);
J = dct2(I) ; %对I 进行二维DCT subplot(3,1,2); imshow(log(abs(J)),[]);
%图像大部分能量集中在左上角处 J (abs (J ) < 10) = 0 ;
%将DCT 变换值小于10的元素设为0 K= idct2 (J ) / 255 ; %对逆DCT 变换值归一化 subplot(3,1,3); imshow(K);
⑵ 将变换后小于255的元素忽略
I = imread('cameraman.tif') ; %装入原始图像 figure
subplot(1,3,1); imshow(I);
J = dct2(I) ; %对I 进行二维DCT subplot(1,3,2); imshow(log(abs(J)),[]);
%图像大部分能量集中在左上角处 J (abs (J ) < 255) = 0 ;
%将DCT 变换值小于255的元素设为0 K= idct2 (J ) / 255 ; %对逆DCT 变换值归一化 subplot(1,3,3); imshow(K);