平滑图像可以通过将每个像素值与它周围相邻像素值进行平均来平滑图像。这就是均值或方盒平滑。均值平滑是由IDL中的功能函数Smooth完成的,它是在给定的奇数宽度的范围内实现等加权值平滑。例如,如果周围是3*3宽度,那么每个像素由它和它的周围八个像素值的平均值代替。比较一幅没有经过平滑处理的图像和经过5*5方盒的均值平滑处理后的图像,键入:IDLWindow,0,XSize=192*3,YSize=192IDLTV,image,0,0IDLsmoothed=Smooth(image,5,/Edge_Truncate)IDLTV,smoothed,192,0注意,与命令Smooth一起使用的关键字Edge_Truncate。该关键字可复制图像边缘附近的像素,以便实现整幅图像的平滑。如果不使用该关键字,图像边缘附近的像素仅仅是简单复制,而没有平滑。图像平滑被应用在一种称作晕光蒙片的图像处理技术中。这种技术可用作定位图像上的棱边或者是像素值突然变化的地方。这种技术非常简单:从未平滑的图像中减去平滑的图像即可。键入:IDLTV,((image-smoothed)+255)/2.0,2*192,0图像显示应如图36所示。用Smooth命令,赋给相邻的像素值相等的权值来计算平均值。有时会导致出现不希望的模糊图像。另一种方式是用称为卷积的过程来平滑图像。这种技术中,一个方形内核和图像一起参与卷积计算。例如,在3*3的情况下,Smooth命令使用的内核为:111111111如果给予中心像素值更大的权值,而它周围像素值的权值小一些,图像就不会那么模糊了。例如,可以创建如下的一个核心:121282121通过Convol命令用上述内核对图像进行卷积处理,键入:IDLkernel=[[1,2,1],[2,8,2],[1,2,1]]IDLTV,image,0,0IDLTV,Smooth(image,3,/Edge_Truncate),192,0IDLTV,Convol(image,kernel,Total(kernel),$/Edge_Truncate),2*192,0图36:左边为原始图像,中间为平滑处理过的图像,右边为经晕光蒙片处理后的图像。当然,可以创建任意大小的内核。如下是一个典型高斯分布的5*5内核:123212711723111711327117212321可将上述内核应用于图像处理:IDLkernel=[[1,2,3,2,1],[2,7,11,7,2],[3,11,17,11,3],$[2,7,11,7,2],[1,2,3,2,1]]IDLTV,Convol(image,kernel,Total(kernel),$/Edge_Truncate),192*2,0消除图像噪声将图像上的噪声消除是一种常规的图像处理技术。噪声来自许多方面,它经常降低图像质量。噪声的一般表现形式是黑白点相间噪声,其中一些随机的像素有极端的像素值。要了解图像平滑是怎样剔除这种噪声的,首先需要创建一幅噪声图像。用以前的图像,并键入如下的命令,将10%的像素转换为黑白点相间噪声:IDLnoisy=imageIDLpoints=RandomU(seed,1800)*192*192IDLnoisy(points)=255IDLpoints=RandomU(seed,1800)*192*192IDLnoisy(points)=0在原始图像的旁边创建一个窗口并显示噪声图像:IDLWindow,XSize=192*3,YSize=192IDLTV,image,0,0IDLTV,noisy,192,0IDL中的Median命令是从图像上消除黑白点相间噪声的很好选择。Median命令与Smooth命令类似。不同之处是Median命令计算相邻像素的中间值,而不是平均值。这就有两个重要作用。第一,它能删除图像中的极端值。第二,它不使那些尺寸比邻域范围大的图像棱边或特征变模糊。要看是如何工作的,键入:IDLTV,Median(noisy,3),2*192,0图形显示应如图37所示。图37:左边为原始图像,中间为噪声图像,右边为用中值滤波器平滑处理后的噪声图像。增强图像棱边一个图像可以锐化或通过微分来增强图像棱边。IDL提供了两个做好的棱边增强函数:Roberts和Sobel。还有一些其它方法也可用来增强图像棱边。例如,可以用拉普拉斯算子来和图像做卷积:1111-71111因为改进了图像棱边的对比度,这也常常被称为拉普拉斯(Laplacian)锐化操作。需要了解这些方法是如何工作的,可键入:IDLTV,Sobel(image),0IDLTV,Roberts(image),1IDLkernel=[[1,1,1],[1,-7,1],[1,1,1]]IDLTV,Convol(image,kernel),2图形显示应如图38所示。图38:三种增强图像棱边的方式。左边用的是Sobel方法。中间用的是Roberts方法。右边是用拉普拉斯算子对图像做卷积。图像的频域滤波频域滤波是常规的图像和信号处理技术。它可以用来平滑处理图像,锐化图像,降低图像的模糊程度,和恢复图像。频率域滤波有如下三个基本步骤:1.用快速傅里叶变换(FFT)将图像从空间域转变为频域。2.将转换后的图像乘以一个频率滤波器。3.将滤波后的图像返回为空间域。这些步骤在IDL中是用快速傅里叶变换(FFT函数)完成的。(如果命令FFT的第二个定位参数为-1,则图像由空间域转变为频域。如果参数为1,则图像将相反转化)。频率滤波命令的一般形式如下:filtered_image=FFT(FFT(image,-1)*filter,1)在这种情况中,image既可是一维矢量,也可以是一幅二维图像。滤波器是用来滤波图像中某些特定频率的一维矢量或二维数组。下面将详细介绍。创建图像滤波器在IDL中用基于数组的操作和函数很容易创建图像数字滤波器。许多普通的滤波器利用了所谓的频率图像或欧氏距离图的优点。一幅二维图像的欧氏距离图是一个与图像有同样大小的数组。距离图的每个像素被赋给一个值,这个值等于它到二维数组最近的角的距离。在IDL中的Dist命令用作创建欧氏距离图或频率图像。要观看一幅简单的距离图,可键入:IDLSurface,Dist(40)在频域滤波中所用的滤波器一般为Butterworth频率滤波器。如下的方程给出一个低过Butterworth频率滤波器一般形式:filter=1/[1+C(R/R0)2n]其中,常量C等于1.0或0.414[这个值将滤波器的幅度在R=R0时定义为50%或1/Sqrt(2)],R为频率图像,R0为给定的滤波器截止频率(实际中由像素宽度代替),n是滤波器的阶数,通常为1。高过Butterworth滤波器由如方程给出:filter=1/[1+C(R0/R)2n]要将频域滤波器应用到图像中,可用命令LoadData来打开图像EarthMantleConvection。这是一个248*248的二维数组。IDLconvec=LoadData(11)键入如下命令来打开一个窗口,装入颜色表StandardGrammaII,并在左上角显示原始图像:IDLWindow,0,XSize=248*2,YSize=248*2IDLLoadCT,5IDLTV,convec,0,248在频域滤波中的第一步是用函数FFT将图像由空间域转换为频率域,键入:IDLfreqDomainImage=FFT(convec,-1)通常,低频项代表一般的图像形状,高频项对图像增加细节。浏览频率域的图像通常是没有意义的,但有时对观察频域图像的功率谱有用。功率谱是一幅频域图像中不同组成部分的幅度图。与源点(通常代表图像的中心)不同的距离代表不同的频率,相对源点不同的方向代表在原图像特征的不同方向。每个位置的功率表明该频率的大小和以在图像中的方向。功率谱对分离图像中的周期性结构或噪声是特别有用的。功率谱的幅度通常用对数座标表示,因为功率从某个频率到下一频率的变化非常大。计算出这幅对流图像的功率谱,并将其显示在原始图的相邻位置上,可键入:IDLpower=Shift(Alog(Abs(freqDomainImage)),124,124)IDLTV,power,248,248功率谱中的对称性表明这个图像上在越来越多的频率中包含了许多周期性结构。输出应该类似于图39)。这个练习的目的是过滤掉图像中较高的频率。接下来的一步是用频率滤波器转换图像。ButterWorth低通滤波器用于滤出图像内的高频成分。这些高频成分为图像提供详细信息,所以最终的结果是完成图像的平滑处理。创建低通频率滤波器可键入:IDLfilter=1.0/(1.0D+Dist(248)/15.0)^2注意,截止频率宽度是15个像素。这是足以删除高频的一半。在图39中功率谱可以看到。使用该频率滤波器,再将图像由频率域转换回空间域,最后显示滤波后的图像。键入:IDLfiltered=FFT(freqDomainImge*filter,1)IDLTV,filtered,0,0为了让自己看到滤掉高频成分的图像,可以显示滤波后图像的功率谱,并在其旁显示滤波后的图像,键入:IDLfilteredFreqImg=FFT(filtered,-1)IDLpower=shift(Alog(Abs(filteredFreqImg)),124,124)IDLTV,power,248,0图39:频域滤波器的图解。在图的上半部分是没有滤波的图像,左边是它的功率谱。在图的下半部分是滤波后的图像,相邻的左边是它的功率谱。注意,大约一半高频成分在滤波后的图像中已经被消除,消除了很多图像细节信息,也平滑了图像。