数字图像处理与MATLAB 第二章学习笔记

第二章 灰度变换与空间滤波

概述

空间域指的是图像平面本身,是以对图像像素直接进行处理为基础的。

2.1 背景

本章的空间域处理表达式为g(x,y)=T[f(x,y)],f(x,y)为输入图像,g(x,y)为处理后输出的图像,T是在点(x,y)的一个指定邻域上定义的对图像f处理的算子。T还可以对一组图像进行处理,如为了降低噪声而叠加K幅图像。

定义点(x,y)的空间邻域主要方法:利用一块中心位于(x,y)的正方形或矩形区域,中心由起点(如左上角)开始逐个像素移动,移动时包含不同的邻域,算子T会作用于每个位置,得到相应位置的输出图像g。只有中心点在(x,y)的邻域内的像素才被用来计算点(x,y)处的g值。

2.2 灰度变换函数

输出值仅取决于某一点的灰度值。

2.2.1 函数imadjuststretchlim

函数imadjust用于对灰度级图像进行灰度变换,基本语法格式为g=imadjust(f, [low_in high_in],[low_out high_out], gamma).该函数将图像f中的灰度值映射为图像g的新值,low_in以下与high_in以上的值则被截去。输入的图像可以是uint8、uint16、single或double类,输出图像与输入图像属于同一类。该函数中除了f和gamma,所有的输入值都被限定在0和1之间,而与f的类别无关。若high_out小于low_out,则输出灰度将被反转。(就是反色)

参数gamma指定从图像f中的灰度值映射生成图像g的曲线形状,若gamma小于1则映射被加权至较高的输出值(较亮),大于1则被加权至较低的输出值(较暗),若缺省则默认为1。

函数stretchlim可以自动使用函数imadujst而不必关心参数的高低,基本语法格式为Low_High = stretchlim(f),其中Low_High是一个两元素向量,由一个低限和一个高限组成,用于实现对比度拉伸。默认情况下Low_High中的值指定灰度级,这些灰度级充满f底部和顶部1%的所有像素值,该结果以向量*[low_in high_in]的形式用于函数imadjust中,如:g=imadjust(f, stretchlim(f), [ ]);。一种更为普通的语法为Low_High = stretchlim(f, tol),其中tol是一个两元素向量[low_frac high_frac],指定将以低像素值和高像素值充满的图像部分。若忽略则默认值为[0.01 0.99],饱和级别为2%,若tol=0,则Low_High=[min(f(😃) max(f(😃)]*。

2.2.2 对数及对比度拉伸变换

对数和对比度拉伸变换是动态范围运算的基本工具,表达式g=c·log(1+f)。主要应用是压缩动态范围。要使压缩值出现在显示的完整范围内,对于8bit图像使用语句gs=im2uint8(mat2gray(g));。mat2gray限定值为[0,1],im2uint8限定范围为[0,255]。

对比度拉伸变换函数可以把窄范围的输入灰度级扩展为宽范围的输出灰度级,结果是一幅高对比度图像,函数表达式为 s = T ( r ) = 1 1 + ( m r ) E s=T(r)=\frac{1}{1+(\frac{m}{r})^E} s=T(r)=1+(rm)E1,r为输入图像的灰度,s是输出图像的相应灰度值,E用于控制该函数的斜率;MATLAB中该函数对浮点图像的实现方式为g=1./(1+(m./f).^E),因为g限制值为1,因此使用这种变换输出值不能超过区间[0,1]。若函数受限则输出为二值图像,该函数称为阈值化/阈值处理函数。

2.2.3 指定任意灰度变换

实现灰度映射的一种方法是使用函数interp1,语法形式g=interp1(z,T,f),其中f是输入图像,g是输出图像,T是列向量(包含变换函数的值),z是长度与T相同的列向量,形成方式:z=linspace(0,1,numel(T)) ’ ;。对于f中的一个像素值,interp1首先寻找横坐标上的值(z),然后寻找T中的相应值,并将内插的值输出到g中的相应像素位置。

2.2.4 用于灰度变换的一些实用M函数

(本节的函数均为开发,MATLAB不自带)

处理可变数量的输入或输出

函数nargin可以检测输入到M函数的参量数目,语法n=nargin;类似的,函数nargout用于M函数的输出,语法n=nargout

函数nargchk能在M函数体内检测传递的参量的数量是否正确,语法msg=nargchk(low, high, number),在number值小于low时返回信息Not enough input arguments,在number值大于high时返回Too many input parameters,number值介于二者之间则返回一个空矩阵,参量输入数量不正确则对函数nargchk的频繁使用将会通过函数error终止程序执行。实际输入参量的数量由函数nargin决定。

使用变量vararginvarargout可以写出具有可变数量的输入变量或输出变量,声明时必须使用小写形式。当varargin作为一个函数的输入参量使用时,MATLAB将其置入一个包含由用户提供的参量的单元数组中,可以简化要求许多不同输入的函数的结构。

另一种用于灰度变换的M函数

函数tofloat通过应用适当的比例因子,把一幅其他类型的图像变换成single(单精度)类的图像,格式*[g, revertclass] = tofloat(f)*;若f是double或single类,则g=f;revertclass是一个函数句柄,用于把输出转换回与f相同的类。

M函数intrans能执行负片变换、对数变换、伽玛变换、对比度拉伸,源代码中varargin是一个单元数组,其元素用花括号选取。

用于灰度标定的M函数

函数gscale可以将图像标度到全尺度,即最大区间[0,255]或[0,65535],语法为g=gscale(f, method, low, high),其中f为被标定的图像,method有效值是’full8’(默认)和’full16’,使用二者之一则参数low和high在这两种变换中均被忽略。method第三个有效值是*‘minmax’*,此时必须提供其值在区间[0,1]内的参数low与high,灰度级被映射到区间[low, high]内。

2.3 直方图处理与函数绘图

2.3.1 生成并绘制图像直方图

一幅数字图像在区间[0,G]内共有L个灰度级,其直方图定义为下列离散函数 h ( r k ) = n k h(r_k)=n_k h(rk)=nk。表达式中 r k r_k rk是区间[0,G]内的第k级灰度, n k n_k nk为图像中出现 r k r_k rk这种灰度级的像素数。对于uint8和uint16类图像,G=L-1

使用 h ( r k ) h(r_k) h(rk)的所有元素除以图像中的总像素数n即可简单的得到归一化直方图 p ( r k ) = h ( r k ) n = n k n p(r_k)=\frac{h(r_k)}{n}=\frac{n_k}{n} p(rk)=nh(rk)=nnk,对于整数图像,k∈[0,L-1];从基本概率论角度可以认为 p ( r k ) p(r_k) p(rk)是灰度级 r k r_k rk出现的概率的估计。

处理图像直方图的工具箱中,核心函数是imhist,基本语法h=imhist(f,b),f为输入图像,h为其直方图,b是用来形成直方图的“容器”的数目(未包含参量的话默认值256),一个“容器”只是灰度范围的一小部分。得到归一化直方图的表达式为p=imhist(f, b)/numel(f),函数*numel(f)*给出数组f的元素数。

直方图还可以用条形图来绘制,使用函数bar(horz, z, width),z是一个包含将被绘制的点的行向量;horz是一个与z同维数的向量,包含水平刻度的增量;width是一个介于0和1之间的数,默认值0.8,width越大竖条越宽。绘制条形图时常会将水平轴等分为几段降低其分辨率。

函数axis语法格式之一为axis([horzmin horzmax vertmin vertmax]),在水平轴和垂直轴上设置最小值和最大值。另一种语法为axis tight,将轴的上下限设置为数据范围。

函数x/ylabel可以在图形的水平轴和垂直轴上添加轴标记,语法xlabel(‘text string’, ‘fontsize’, size)ylabel(‘text string’, ‘fontsize’, size),其中size是单位为磅的字体大小;使用函数text可以在图中添加文字,语法text(xloc, yloc, ‘text string’, ‘fontsize’, size),其中xloc和yloc定义文字开始的位置,注意设置轴值与标记的函数要在该函数已经被绘制后使用。

使用函数title可以给图形添加标题,语法title(‘titlestring’),标题将显示在图形的中央。

杆状图与条形图相似,语法stem(horz, z, ‘LineSpec’, ‘fill’),其中z是一个包含了将被绘制的点的行向量,horz的说明与函数bar中对其的说明相同;若省略horz则水平轴将会从0到length(z)等分为若干单位。参量LineSpec是一个三值组。

函数plot将一组点用直线连接起来,语法plot(horz, z, ‘LineSpec’),各参量定义与杆状图相同。

表2.1 函数stemplot中所用颜色、线型和标记点的说明符

颜色说明符线型说明符标记点说明符
符号颜色符号线型符号标记
k-实线+加号
w虚线
r:点线*星号
g绿-.虚点线.
b×
cs方形
yd菱形
m深红^上指三角形
下指三角形
>右指三角形
<左指三角形
p五角星形
h六角星形

使用函数xlimylim可以自动设定坐标轴的取值区间和刻度标记,语法形式ylim(‘auto’)xlim(‘auto’),另一种语法形式为ylim([ymin ymax])xlim([xmin xmax]),允许人为规定取值区间。

绘图函数fplot可以处理函数句柄,语法fplot(fhandle, limits, ‘LineSpec’),其中fhandle是一个函数句柄,limits是指定x轴取值区间[xmin, xmax]的向量。使用函数句柄允许底层函数的语法与将被处理函数的参数无关。

2.3.2 直方图均衡化

假设某个瞬间灰度级是归一化到区间[0,1]的连续量,并令 p r ( r ) p_r(r) pr(r)代表一幅给定图像中灰度级的概率密度函数(PDF),其中下标用于区分输入图像和输出图像的概率密度函数。假设对输入灰度级进行下列变换,得到输出灰度级s s = T ( r ) = ∫ 0 r p r ( w ) d w s=T(r)=\int_0^r p_r(w)dw s=T(r)=0rpr(w)dw。式中,w是积分哑变量(虚拟变量),输出灰度级的概率密度函数是均匀的,即 p s ( s ) = { 1 , 0 ≤ s ≤ 1 0 , 其 他 p_s(s)=\begin{cases} 1,0\leq s\leq1 \\0,其他\end{cases} ps(s)={1,0s10,。换句话说,前面的变换生成一幅图像,该图像的灰度级是等概率的,并覆盖整个[0,1]。灰度级均衡化处理的最终结果是一幅扩展了动态范围的、灰度级等概率的图像,有较高对比度。

灰度级为离散值时,利用直方图并调用直方图均衡化技术。处理后图像的直方图不均匀。对于离散灰度级,采用求和的方式,均衡化变换成 s k = T ( r k ) = ∑ j = 0 k p r ( r j ) = ∑ j = 0 k n j n s_k=T(r_k)=\sum_{j=0}^k p_r(r_j)=\sum_{j=0}^k \frac{n_j}{n} sk=T(rk)=j=0kpr(rj)=j=0knnj为。式中,k∈[0,L-1] s k s_k sk是输出图像中的灰度值,对应输入图像灰度值 r k r_k rk

直方图均衡化使用工具箱函数histeq实现,语法g=histeq(f,nlev),f是输入图像,nlev是为输出图像设定的灰度级数(默认值64)。若nlevL(输入图像中可能的灰度级总数)相等,则histeq直接执行变换函数。若nlev小于L则函数试图分配灰度级,以便得到近似平坦的直方图。

使用函数cumsum实现归一化直方图的累加求和,语法列表如下:

hnorm = imhist(f)./numel(f); %Normalized histogram.
cdf = cumsum(hnorm); %CDF.

绘制出的图形中的文本可以使用包含该图形的MATLAB图形窗口中Insert菜单下的TextBox和Arrow命令插入(更易于使用),也可以用函数annotation书写代码插入文本框和箭头。

2.3.3 直方图匹配(规定化)

生成具有特定直方图的图像的方法称为直方图匹配或直方图规定化。考虑图像归一化后在区间[0,1]连续的灰度级,令r和z分别表示输入与输出图像的灰度级,输入图像的灰度级有概率密度函数 p r ( r ) p_r(r) pr(r),输出图像的灰度级由规定的概率密度函数 p z ( z ) p_z(z) pz(z)。该变换为 s = T ( r ) = ∫ 0 r p r ( w ) d w s=T(r)=\int_0^r p_r(w)dw s=T(r)=0rpr(w)dw,得到的灰度级s具有均匀的概率密度函数 p s ( s ) p_s(s) ps(s)。现在假设我们定义变量z具有下列特性: H ( z ) = ∫ 0 z p z ( w ) d w = s H(z)=\int_0^z p_z(w)dw =s H(z)=0zpz(w)dw=s,由前面两个等式可得 z = H − 1 ( s ) = H − 1 [ T ( r ) ] z=H^{-1}(s)=H^{-1}[T(r)] z=H1(s)=H1[T(r)]。结论:只要找到 H − 1 H^{-1} H1,就能利用前面的等式得到变换后的灰度级z,其概率密度函数为规定的 p z ( z ) p_z(z) pz(z)

当处理离散变量时,我们能够保证 p z ( z ) p_z(z) pz(z)为正确的直方图概率密度函数(即该直方图具有单位面积且其各灰度值均为非负),H的反变换存在,且其元素值非零。

函数histeq可实现直方图匹配,语法g=histeq(f,hspec),f为输入图像,hspec为规定的直方图(一个规定值的行向量),g为输出图像,输出图像的直方图近似于规定的直方图hspec;该向量中包含对应于等分容器的整数计数值;函数特性是当length(hspec)比图像f中的灰度级数小很多时,图像g的直方图通常会较好的匹配hspec

2.3.4 函数adapthisteq

此函数执行对比度受限的自适应直方图均衡化,此方法用直方图匹配方法来逐个处理图像中的较小区域(称为小片),然后使用双线性内插法将相邻的小片组合起来,从而消除人为引入的边界;在均匀灰度区域可以限制对比度来避免放大噪声。语法g=adapthisteq(f, param1, val1, param2, val2, …),f是输入图像,g是输出图像,param/val是下表所列内容:

参数
‘NumTiles’一个由正整数组成的两元素向量[r, c],由向量的行和列指定小片数。r、c必须至少是2,小片总数等于r*c。默认值[8 8]
‘ClipLimit’区间[0,1]内的标量,用于指定对比度增强的限制。较高的值产生较强的对比度,默认值0.01
‘NBins’针对建立对比度增强变换所用的直方图容器数目指定的正整数标量。较高的值会在较慢的处理速度下导致较大的动态范围,默认值256
‘Range’规定输出图像数据范围的字符串
‘original’——范围被限制到原图像的范围,[min(f(😃) max(f(😃)]
‘full’——使用输出图像类的整个范围。例如对于uint8类的数据,区间是[0,255],是默认值为图像小片指定期望直方图形状的字符串
‘Distribution’指定期望直方图形状的字符串
‘uniform’——平坦直方图(默认)
‘rayleigh’——钟形直方图
‘exponential’——曲线直方图
‘Alpha’适用于瑞利和指数分布的非负标量,默认值0.4

2.4 空间滤波

邻域处理步骤:**1.**选取中心点(x, y);**2.**仅对预先定义的关于点(x, y)的邻域内的像素执行运算;**3.**令运算结果为该点处的响应;**4.**对图像中的每一点重复该处理。

2.4.1 线性空间滤波(空间卷积)

本章的线性运算包括邻域中每个像素乘以相应的系数,将结果求和,从而得到点(x, y)处的响应。这些系数被排列成一个矩阵,称为滤波器、模板、滤波模板、核、掩模或窗口,也采用卷积滤波、卷积模板、卷积核等术语。

线性空间滤波原理:在图像f中逐点移动滤波模板w的中心,在每个点(x, y)处,滤波器在该点的的响应是由滤波模板限定的对应邻域像素与滤波器系数乘积结果的累加和。所有的假设都基于模板大小为奇数尺寸的原则,有意义的最小模板尺寸是3×3,原因是其具有一个明确的中心点。

相关是指令模板w按照上述方式通过图像数组f的处理;原理方面讲卷积是相同的过程,只不过在w通过f之前先将其旋转180°。

大小为m×n的滤波模板w(x, y)与函数f(x, y)的相关,由 w ( x , y ) ☆ f ( x , y ) w(x, y)☆f(x, y) w(x,y)f(x,y)表示: w ( x , y ) ☆ f ( x , y ) = ∑ s = − a a ∑ t = − b b w ( s , t ) f ( x + s , y + t ) w(x, y)☆f(x, y)=\sum_{s=-a}^a \sum_{t=-b}^b w(s,t)f(x+s,y+t) w(x,y)f(x,y)=s=aat=bbw(s,t)f(x+s,y+t)。该公式对所有的偏移变量x和y求值,以便w中所有变量访问f中的每个像素,其中假定 f已被适当进行了0填充;常数ab a = ( m − 1 ) / 2 a=(m-1)/2 a=(m1)/2 b = ( n − 1 ) / 2 b=(n-1)/2 b=(n1)/2给出。假定m、n为奇整数。

类似的,w(x, y)和f(x, y)的卷积由 w ( x , y ) ★ f ( x , y ) w(x, y)★f(x, y) w(x,y)f(x,y)表示: w ( x , y ) ★ f ( x , y ) = ∑ s = − a a ∑ t = − b b w ( s , t ) f ( x − s , y − t ) w(x, y)★f(x, y)=\sum_{s=-a}^a \sum_{t=-b}^b w(s,t)f(x-s,y-t) w(x,y)f(x,y)=s=aat=bbw(s,t)f(xs,yt)。式中右边的减号翻转f。旋转和移动f而替代w是为了简化符号表示,结果相同。

工具箱函数imfilter实现线性空间滤波,语法g=imfilter(f, w, filtering_mode, boundary_options, size_options),其中f为输入图像,w为滤波模板,g为滤波后的结果,其他参数见下表。

表2.3 函数imfilter选项

选项描述
filtering_mode
‘corr’使用相关完成滤波。默认值。
‘conv’使用卷积完成滤波。
boundary_options
P输入图像的边界通过使用值P填充来扩展。默认选项,值为0。
‘replicate’图像大小通过复制图像边界外的值来扩展。
‘symmetric’图像大小通过边界镜像反射来扩展。
‘circular’图像大小通过将图像处理为二维周期函数的一个周期来扩展。
size_options
‘full’输出与扩展(填充)后的图像大小相同。
‘same’输出图像的大小与输入图像的大小相同。是通过将滤波模板中心的偏移限制到原图像中所包含的点来实现。默认值。

该函数最常见的语法是g=imfilter(f, w, ‘replicate’),以实现标准线性空间滤波。

希望使用卷积时语法1:g=imfilter(f, w, ‘conv’, ‘replicate’),2:(使用函数rot90(w, 2)将w旋转180°)g=infilter(f, rot90(w, 2), ‘replicate’)。结果是 一幅大小与输入相同的图像。

滤波后图像的每个元素都是用浮点算法来计算,但imfilter会将输出图像转换为与输入图像相同的类。若要求更高的精度,则在使用imfilter之前使用函数im2singleim2doubletofloat将f转换为浮点型。

2.4.2 非线性空间滤波

同样基于邻域运算,原理与上一节相同;非线性空间滤波是基于涉及滤波器包围的邻域内像素的非线性运算,同时模板概念在非线性空间滤波中不是那么普遍。

常见的非线性滤波函数为nlfiltercolfilt,前者直接执行二维运算,后者按列的方式组织数据(需要更多内存但是运行速度快)。colfilt语法为g=colfilt(f, [m, n], ‘sliding’, fun),其中m、n表示滤波区域的维数,'sliding’表示处理过程是m×n区域在输入图像f中逐像素地滑动,fun是一个函数句柄;假定给定一幅大小M×N的输入图像f,邻域大小m×n,使用函数则生成一个最大尺寸mn×MN的矩阵。基于矩阵A的组织方式,函数fun必须分别对A的每一列进行运算,并返回一个行向量v,v的第k个元素即是对A中第k列进行fun运算的结果。因为A最多有MN列,所以v最大维数为1×MN

函数padarray可以通过填充图像来处理空间滤波中固有的边界问题,语法fp=padarray(f, [r c], method, direction),f为输入图像,fp为填充后的图像,[r c]表示用于填充f的行数和列数,method和direction见下表:

表2.4 函数padarray的选项

选项描述
method
‘symmetric’图像的尺寸通过边界镜像反射扩展
‘replicate’图像的尺寸通过复制外部边界的值来扩展
‘circular’图像的尺寸通过将图像视为一个二维周期函数的一个周期来扩展
direction
‘pre’在每维的第一个元素之前填充
‘post’在每维的最后一个元素之后填充
‘both’在每维的第一个元素之前和最后一个元素之后填充。默认值

若实现一个非线性滤波器,该滤波器在任何点的响应都是以该点为中心点的邻域中的像素灰度值的几何平均,大小为m×n的邻域中的几何平均是该邻域内灰度值乘积的1/mn次幂。使用匿名函数句柄实现非线性滤波器函数:gmean = @(A) prod(A, 1)^1/size(A, 1);

2.5 图像处理工具箱的标准空间滤波器

2.5.1 线性空间滤波器

函数fspecial可以得到预定义的二维线性空间滤波器,生成一个滤波模板w,语法w=fspecial(‘type’, parameters), 'type’指定滤波器的类型,parameters进一步定义规定的滤波器。由fspecial生成的空间滤波器汇总于下表,包含每种滤波器的适用参数。

表2.5 函数fspecial所支持的空间滤波器。(表中的几个滤波器用于7.1节的边缘检测)

类型语法和参数
‘average’fspecial(‘average’, [r c])。一个大小为r×c的矩形平均滤波器,默认值3×3。若由单个数代替[r c],则表示是一个正方形滤波器。
‘disk’fspecial(‘disk’, r)。一个半径为r的圆形平均滤波器(包含在2r+1大小的正方形内),默认半径5。
‘gaussian’fspecial(‘gaussian’, [r c], sig)。一个大小r×c、标准差为sig(正)的高斯低通滤波器,默认值3×3和0.5。若由单个数代替[r c],则表示是一个正方形滤波器。
‘laplacian’fspecial(‘laplacian’, alpha)。一个大小为3×3的拉普拉斯滤波器,形状由alpha指定。alpha是一个区间在[0, 1]内的数,默认值0.2。
‘log’fspecial(‘log’, [r c], sig)。一个大小为r×c、标准差为sig(正)的高斯-拉普拉斯(LoG)滤波器。默认值5×5和0.5。若用单个数代替[r c],则表示是一个正方形滤波器。
‘motion’fspecial(‘motion’, len, theta)。当与一幅图像卷积时,输出一个滤波器来近似计算len个像素的线性运动(类似相机与景物之间的关系)。运动方向theta,单位为度,以水平方向为参考逆时针转动,默认值9和0,表示沿水平方向9个像素的运动。
‘prewitt’fspecial(‘prewitt’)。输出一个大小为3×3的Prewitt滤波器wv,用来计算垂直梯度。水平梯度模板可以通过将结果转置来得到:wh=wv’
‘sobel’fspecial(‘sobel’)。输出一个大小为3×3的Sobel滤波器sv,用来近似计算垂直梯度。水平梯度滤波器可以通过将结果转置来得到:sh=sv’
‘unsharp’fspecial(‘unsharp’, alpha)。输出一个大小为3×3的钝化滤波器,alpha控制形状,值必须在[0,1]内,默认值0.2。
例2.10 使用函数imfilter实现拉普拉斯滤波器

图像*f(x, y)*的拉普拉斯算子定义为 ∇ 2 f ( x , y ) \nabla^2f(x,y) 2f(x,y) ∇ 2 f ( x , y ) = ∂ 2 f ( x , y ) ∂ x 2 + ∂ 2 f ( x , y ) ∂ y 2 \nabla^2f(x,y)=\frac{\partial^2f(x,y)}{\partial x^2}+\frac{\partial^2f(x,y)}{\partial y^2} 2f(x,y)=x22f(x,y)+y22f(x,y),二阶导数的常用数字近似为 ∂ 2 f ( x , y ) ∂ x 2 = f ( x + 1 , y ) + f ( x − 1 , y ) − 2 f ( x , y ) \frac{\partial^2f(x,y)}{\partial x^2}=f(x+1,y)+f(x-1,y)-2f(x,y) x22f(x,y)=f(x+1,y)+f(x1,y)2f(x,y) ∂ 2 f ( x , y ) ∂ x 2 = f ( x , y + 1 ) + f ( x , y − 1 ) − 2 f ( x , y ) \frac{\partial^2f(x,y)}{\partial x^2}=f(x,y+1)+f(x,y-1)-2f(x,y) x22f(x,y)=f(x,y+1)+f(x,y1)2f(x,y),因而有 ∇ 2 f ( x , y ) = f ( x + 1 , y ) + f ( x − 1 , y ) + f ( x , y + 1 ) + f ( x , y − 1 ) − 4 f ( x , y ) \nabla^2f(x,y)=f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y) 2f(x,y)=f(x+1,y)+f(x1,y)+f(x,y+1)+f(x,y1)4f(x,y)。该表达式可应用于图像中的所有点,方法是使用下面的空间模板与图像卷积: 0 1 0 1 − 4 1 0 1 0 \begin{matrix} 0&1&0\\1&-4&1\\0&1&0\end{matrix} 010141010

数字二阶导数的一种可选定义是考虑对角线元素,且可以使用下面的模板实现: 1 1 1 1 − 8 1 1 1 1 \begin{matrix} 1&1&1\\1&-8&1\\1&1&1\end{matrix} 111181111。两个导数有时可以用这里所示大的相反符号定义,得到与前面两个模板正好相反的结果。

使用拉普拉斯算子进行图像增强的基本公式是 g ( x , y ) = f ( x , y ) + c [ ∇ 2 f ( x , y ) ] g(x,y)=f(x,y)+c[\nabla^2f(x,y)] g(x,y)=f(x,y)+c[2f(x,y)],f(x, y)是输入图像,g(x, y)是增强后的图像;模板中心系数为正时c为1,否则-1。拉普拉斯是微分算子,因此会使图像钝化,但也会使恒定区域为0。

函数*fspecial(‘laplacian’,alpha)*实现一个更为通用的拉普拉斯模板: a 1 + a 1 − a 1 + a a 1 + a 1 − a 1 + a − 4 1 + a 1 − a 1 + a a 1 + a 1 − a 1 + a a 1 + a \begin{matrix} \frac{a}{1+a}&\frac{1-a}{1+a}&\frac{a}{1+a}\\\frac{1-a}{1+a}&\frac{-4}{1+a}&\frac{1-a}{1+a}\\\frac{a}{1+a}&\frac{1-a}{1+a}&\frac{a}{1+a}\end{matrix} 1+aa1+a1a1+aa1+a1a1+a41+a1a1+aa1+a1a1+aa,可以对增强的结果进行更精细的调整。

2.5.2 非线性空间滤波器

函数ordfilt2计算排序统计滤波器(排序滤波器),是非线性空间滤波器,其响应基于对图像邻域中包含像素的排序,然后使用排序结果确定的值替换邻域的中心像素值,语法:g=ordfilt2(f, order, domain)。该函数使用邻域的排序集合中第order个元素去替代f中每个元素,来生成输出图像g,其中邻域由domain内的非零元素指定。这样,domain是一个0和1组成的大小为m×n的矩阵,其规定了在计算中所用的邻域的像素位置。从此意义上说domain相当于一个逻辑模板,计算时不使用邻域中对应domain矩阵中的0像素。

最大滤波器实现:g=ordfilt2(f, m×n, ones(m, n))

中值滤波器实现:g=ordfilt2(f, (m×n + 1)/2, ones(m, n)),(m、n为奇数)。另一种专门实现:g=medfilt2(f, [m n], padopt),数组[m n]定义一个大小为m×n的邻域(在该邻域上计算中值),padopt指定三个可能的边界填充选项之一:‘zeros’(默认值)、‘symmetric’(镜像)、‘indexed’(若f是double类则用1填充,否则0填充);默认形式g=medfilt2(f),使用一个大小为3×3的邻域并用0填充边界来计算中值。

例2.12 利用函数medfilt2进行中值滤波

中值滤波是降低图像中椒盐噪声的一种有效工具。使用函数imnoise可以对图像施加椒盐噪声;使用选项’symmetric’可以降低降噪过程中的边界效应。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值