数字图像处理第二章 灰度变换与空间滤波

灰度变换与空间滤波

本章我们将学习空间域处理中主要的两类方法灰度变换和空间滤波,灰度变换对图像的单个像素进行操作,主要以对比度和阈值处理为目的;空间滤波涉及改善性能的操作,如通过图像中每个像素的邻域处理来锐化图像。接下来我们将从理论到实验来深入理解这两种方法。

1 背景知识

本章里我们所讨论的所有图像处理技术都是在空间域进行的,我们所知道的空间域就像上一章中介绍的一样是包含图像像素的简单平面。故我们本章讨论的空间域处理可由下式表示: g ( x , y ) = T [ f ( x , y ) ] g(x,y)=T[f(x,y)] 上式中,f(x,y)是输入图像,g(x,y)是处理后的图像,T是在点(x,y)的邻域上定义的关于f的一种算子。算子可应用于单幅图像或图像集合,在数字图像处理中,算子是一个很重要的概念,现在让我们具体理解一下。

上式中我们的(x,y)是图像中的任意一个位置,包含该点的小区域是点(x,y)的邻域,我们接下来接触的邻域大多数都是中心在(x,y)矩形,邻域原点从一个像素向另外一个像素移动,对邻域中的像素应用算子T,并在该位置产生输出。这样,对于任意指定位置(x,y)输出图像g在这些坐标处的值,等于对f中以(x,y)为原点的邻域应用算子T的结果。

在下图中,开始的邻域原点在A5处,通过使用一个预定义的算子,根据算子的运算由邻域中的A1到A9(包括A5)像素的值运算得到新的在A5点像素的值,得到新的A5值以后邻域会移动,邻域中心移动到下一个位置B5,通过上述运算得到新的B5的值,直到图像中所有需要运算的像素点全部进行运算。

算子
上面我们描述的过程称为空间滤波,其中邻域与预定义的操作一起称为空间滤波器(也被称为空间掩模、核、模板或窗口)。

我们大概了解了空间滤波方法,那么如果我们把邻域缩小到1×1,在这种情况下,新的像素值g仅仅取决于点(x,y)处的f值,那么我们就引出了灰度变换的概念,并且我们可以得到一个形如下式的灰度变换函数 s = T ( r ) s=T(r) 上式中s和r表示g和f在任意点(x,y)处的灰度,由此我们可见,灰度变换实际上是空间滤波的一种特殊形式,那么接下来让我们一起深入学习一下灰度变换和空间滤波的理论和方法吧!

2 灰度变换

2.1基本的灰度变换函数

下图中显示了图像增强(视觉感触最明显的应用领域)常用的三类基本函数:线性函数(反转变换和恒等变换),对数函数(对数和反对数变换)和幂律函数(n次幂和n次根变换)。

灰度变换函数
(Ⅰ)图像反转
图像反转就是上图中的反转变换,可得到灰度级范围为[0,L-1]的一幅图像的反转图像,该反转图像由下式给出: s = L 1 r s=L-1-r 使用这种变换可以反转一幅图像的灰度级,从而去突出图像暗色区域中的白色或灰色细节,特别是当黑色面积在尺寸上占主导地位时。

(Ⅱ)对数变换
对数变换的通用形式为 s = c l o g ( 1 + r ) s=clog(1+r) 上式中的c是常数,并且假设r大于等于0。由上图我们可以看到,对数变换可以将输入中范围较窄的低灰度值映射为输出中范围较宽的灰度值,或将输入中范围较宽的灰度值映射为输出中范围较窄的灰度值。我们使用对数变换可以用来扩展图像中的暗像素值,同时压缩更高灰度的值。反对数函数作用刚好相反。

(Ⅲ)幂律(伽马)变换
幂律变换的基本形式为 s = c r γ s=cr^γ 上式中c和γ是正常数,我们调整γ的值可以得到很多的伽马变换。

伽马
我们从上图中很容易发现伽马变换与对数变换的相似处,但是变化取决于γ的取值,我们可以使用伽马变换去增强对比度,对于整体比较暗的图像,选择一个小于1的伽马值,来扩展灰度级;对于整体比较亮的图像,选择一个大于1的伽马值,来压缩灰度值。

我们下面使用matlab中的imadjust函数去简单看一下图像的灰度变换。

f = imread('jimei3.jpg'); 
g = rgb2gray(f); 							%将彩色图像变换为灰度图像
g1 = imadjust(g, [0 1], [1 0]);  			%对图像的像素值进行翻转
g2 = imadjust(g, [0.5 0.75], [0 1]);		%将图像像素灰度值在[0.5 0.75]范围内扩展到[0 1]内
g3 = imadjust(g, [0 1], [0.5 0.75]);		%将图像像素灰度值在[0 1]范围压缩到[0.5 0.75]
g4 = imadjust(g, [], [], 2);				%用非线性变换 伽马大于1时
g5 = imadjust(g, [], [],0.6);				%用非线性变换 伽马小于1时

结果如下

12
1
11
上面图片按照顺序为g,g1, g2, g3, g4, g5
分析:
(1)我们对g进行翻转操作得到g1负片图像,在这种情况下我们更容易去用肉眼观察到本身灰度值较大区域的一些细节。
(2)g2则是将中间灰度向两侧拉伸,将图像变得更加鲜艳,如果是彩色图像会更加明显。
(3)g3与g2相反,我们去缩小对比度,图像变得更加模糊,如果作用于对比度较高的图片优化效果会更好。
(4)g4使用非线性变换,采用伽马值大于1的伽马变换去处理图像灰度值,整体拉高了中间灰度,使图像变得更加明亮,作用于对比度较低的图像效果会更好。
(5)g5也使用非线性变换,采用伽马值小于1的伽马变换去处理图像灰度值,整体降低了中间灰度,使图像变得更加暗淡,作用于对比度较高的图像效果会更好。

matlab中的stretchlim函数可以根据图像生成一个两元素的向量,自动去完成一个对比度的拉伸。

Low_High = stretchlim(f);
g6 = imadjust(f,Low_High,[]);

效果如下
11

2.2 直方图处理

直方图处理是本章中的重点也是难点,我们要认真从理论到实践都要理解透彻。

2.2.1 直方图是什么
灰度级范围为[0,L-1]的数字图像的直方图是离散函数h(rk)=nk,其中rk是第k级灰度值,nk是图像中灰度为rk的像素个数。在实践中我们经常用乘积MN表示的图像总像素除每个分量来归一化直方图,通常M和N是图像的行数和列数。归一化后的直方图由p(rK)=nk/MN给出,简单来说,p(rk)是灰度级rk在图像中出现的概率的估计。

matlab中最简单的直方图绘制函数就是imhist

f = imread('jimei2.jpg');
g = rgb2gray(f);
imhist(g);

11
实际上这里绘制的是彩色图像灰度化的直方图。

2.2.2 直方图均衡
我们先从理论阶段学习直方图均衡,假设图像灰度值是连续的,并且用变量r表示待处理图像的灰度。通常,我们假设r的取值区间为[0,L-1],且r=0表示黑色,r=L-1表示白色。在r满足这些条件的情况下,我们将注意力集中在下面的变换形式上 s = T ( r ) , 0 r L 1 s=T(r),0≤r≤L-1 我们称这个变换形式为灰度映射,对于输入图像中每个具有r值的像素产生一个输出灰度值s。同时上式是在以下的两个假设上成立
(a)T(r)在区间 0 ≤ r≤ L-1 上为严格的单调递增函数。
(b)当 0 ≤ r ≤ L-1时,0 ≤ T(r)≤ L-1。
同时在稍后我们要学习的直方图规定化中我们会用到反函数 r = T 1 ( s ) , 0 s L 1 r=T^{-1}(s),0≤s≤L-1
现在我们令pr(r)和ps(s)分别表示随机变量r和s的概率密度函数,我们认为在理想条件下图像灰度值的概率分布函数在直方图均衡的前后是不变的,于是我们可以得到下式(Ⅰ):
p s ( s ) = d [ r p r ( r ) d r ] d r d r d s = p r d r d s p_s(s)=\frac{d[\int^r_{-\infty}p_r(r)dr]}{dr}\cdot\frac{dr}{ds}=p_r\frac{dr}{ds} 同时我们灰度映射函数用pr可以表示为(Ⅱ): s = T ( r ) = ( L 1 ) 0 r p r ( w ) d w s=T(r)=(L-1)∫_{0}^rp_r(w)dw 这里的w是积分的假变量,式子右边是随机变量r的累积分布函数,接着我们用基本积分学中的莱布尼兹准则去化简上面两个式子,得到dr/ds的积分值(Ⅲ): d s d r = d T ( r ) d r = ( L 1 ) d [ 0 r p r ( w ) d w ] d r = ( L 1 ) p r ( r ) \frac{ds}{dr}=\frac{dT(r)}{dr}=(L-1)\frac{d[\int^r_{0}p_r(w)dw]}{dr}=(L-1)p_r(r) 我们再把式(Ⅲ)代入式(Ⅰ)化简既可以得到: p s ( s ) = 1 L 1 p_s(s)=\frac{1}{L-1} 到此我们的理论推导就结束了,我们可以得到一个很清晰的结果,就是在图像灰度值是连续的情况下我们可以找到灰度映射函数将直方图变换成一个完全符合均匀分布的直方图。

但是在我们实际处理的图像中,像素的灰度值都是离散的,所以我们处理其概率(直方图值)与求和来替代处理概率密度函数与积分。我们类比前面连续情况下的推导,一幅数字图像中灰度级rk出现的概率我们近似为: p r ( r k ) = n k M N p_r(r_k)=\frac{n_k}{MN} 上面理论推导中的(Ⅱ)式我们也可以从离散形式表示为: s k = T ( r k ) = ( L 1 ) j = 0 k p r ( r j ) = ( L 1 ) M N j = 0 k n j s_k=T(r_k)=(L-1)\sum_{j=0}^kp_r(r_j)=\frac{(L-1)}{MN}\sum_{j=0}^kn_j 在这个公式中,变换(映射)T(rk)称为直方图均衡直方图线性变换

matlab中直方图均衡化由工具箱中的 histeq 函数实现

imhist(g);
ylim('auto')
g2 = histeq(g, 256);
figure,imshow(g2);
figure,imhist(g2);
ylim('auto')
imshow(g);

11上方为直方图未处理时,下方为直方图均衡化以后。
11
分析:我们由此可见虽然我们在理论上可以让变换后的直方图为均匀分布,但是实际离散效果下我们可以看到直方图均衡化以后更多的是让图像有一个较好的对比度,同时使得原直方图再变换以后更加“平滑”,但变换的图像在边缘处明显有一点失真,出现了伪轮廓。

2.2.3 直方图匹配(规定化)
直方图均衡能自动地确定变换函数,该函数寻求产生有均匀直方图的输出图像,当我们需要自动增强时,这是一种好方法,但对于某些应用时,采取均匀直方图的基本增强并不是一种最好的解决方法,有时我们希望处理后的图像具有规定的直方图形状可能会更加有用,我们称这个过程为直方图匹配直方图规定化

直方图匹配的理论在这里就不给大家推导了,如果你可以详细明白直方图均衡的理论推导,那么直方图匹配的理论推导对你并没有难度。如果我们想要将图像A的直方图变为目标直方图B,那么就进行以下过程:在这里插入图片描述
这样我们就可以看出直方图匹配实质上是两次直方图均衡的复合形式,以均匀分布为中介作为媒介变换直方图。

f = rgb2gray(imread('jimei1.jpg'));
g = rgb2gray(imread('jimei2.jpg'));
g1 = imhist(g);
match = histeq(f,g1);
figure;
subplot(2, 3, 1), imshow(f), title('Original image');
subplot(2, 3, 2), imshow(g), title('Template image');
subplot(2, 3, 3), imshow(match), title('Matched image');
subplot(2, 3, 4), imhist(f), title('Histogram of original image');
subplot(2, 3, 5), imhist(g), title('Histogram of Template image');
subplot(2, 3, 6), imhist(match), title('Histogram of Matched image');

结果如下
在这里插入图片描述
分析:我们还是可以从结果看出来直方图匹配达到效果还是比较明显的,我们可以看到由于模板图像的直方图较暗这样使得最后匹配的图像也明显较暗,这样就显现出了直方图规定化的优势所在,我们不需要去平衡整个图像的对比度,在实际操作中,我们往往就光去放大我们感兴趣的目标点特征就好了,比如脑部CT图像,我们仅仅去放大肿瘤的对比度使得我们可以很好的观察他的结构与特征,其他健康部位的信息我们反而不需要去关注,甚至摸除了健康部分的特征也是我们可以接受的。

3 空间滤波

3.1空间滤波基础

空间滤波是图像处理领域应用广泛的主要工具之一,我们前面已经简单介绍过了,滤波一词借用于频率域处理,滤波是指接受(通过)或者拒绝一定的频率成分,就像我们前面介绍的,空间滤波器由一个邻域(通常是一个较小的矩形),对该邻域所包围图像像素执行预定义操作组成。滤波产生一个新像素,新像素的坐标等于邻域中心的坐标,像素的值是滤波操作的结果。

在执行线性空间滤波时,我们必须要清楚两个相近的概念。一个是相关,另一个是卷积。这里就不详细介绍两个基本概念了,没有接触过的同学可以先查一下,接下来我们将从两个角度去深入空间滤波的学习。

3.2 平滑空间滤波器

平滑滤波器顾名思义,主要用于图像的模糊处理和降低噪声,通常我们可以用于图像的预处理任务中,提前去除一些我们不敢兴趣的琐碎细节,平滑滤波器也分为平滑线性滤波器和非线性滤波器。

3.2.1 平滑线性滤波器

我们先来接触一个最简单最直观的平滑滤波器,也就是均值滤波器,它使用滤波器模板确定的邻域内像素的平均值来代替图像中每个像素的值,这种处理降低了图像中尖锐的变换同时可以消除典型的随机噪声引起的剧烈变化,对于下图左边的3×3平滑滤波器,从它的代入式我们就可以清晰的看出他的作用: R = 1 9 i = 1 9 z i R=\frac{1}{9}\sum_{i=1}^9z_i 所有系数相等的空间均值滤波器有时都被称为box模板。
在这里插入图片描述
上图中右边的加权均值模板更为重要,它并不是仅仅取邻域内像素的平均值,而是还考虑到了周围邻域内距离原点远近的权值,最后得到的结果是一个加权平均的过程,考虑权值这种思想应用于不止图像处理,还应用于许多算法和学科当中。如果我们将这种权值在去细分,我们就可以得到如下图的高斯核会更加考虑到每个像素位置的权值。在这里插入图片描述

空间均值处理的一个重要应用是,模糊图像以便得到感兴趣物体的粗略描述,因此那些较小物体的灰度就会与背景混合在一起,较大物体则变得像“斑点”而易于检测。

我们这里用3×3的滤波器去简单实验一下:

f = rgb2gray(imread('dog1.jpg'));
g = im2double(f);
w = ones(9);
gd = imfilter(g,w);
imshow(gd,[]);

结果如下 我们还是可以看到很明显的模糊
11

3.2.2 统计排序(非线性)滤波器

统计排序滤波器是一种非线性空间滤波器,这种滤波器的响应以滤波器包围的图像区域中包含得像素排序(排队)为基础,然后使用统计排序结果决定的值代替中心像素的值。

中值滤波器是最知名的排序滤波器,常用于处理脉冲噪声,也叫做椒盐噪声,下图就是一个中值滤波器应用的情况,在对于单个或者单方向的脉冲噪声就很好用中值滤波器消除。
在这里插入图片描述
这里我们用matlab中的函数 medfilt2 的中值滤波来实验一下:

f = rgb2gray(imread('dog3.jpg'));
figure;
subplot(2,2,1), imshow(f),title('Original image');
fn = imnoise(f,'salt & pepper',0.2);
subplot(2,2,2),imshow(fn),title('Images polluted by salt and pepper noise');
gm = medfilt2(fn);
subplot(2,2,3),imshow(gm),title('Median filter noise reduction');
gms = medfilt2(fn, 'symmetric');		%symmetric选项去除了图像边沿外黑点的影响
subplot(2,2,4),imshow(gms),title('Strengthen median filter to reduce noise');

在这里插入图片描述

3.3 锐化空间滤波器

3.3.1 图像锐化原理

我们刚才学习的平滑滤波器的任务是去模糊图像,那么锐化空间滤波器的任务就是去突出图像中的点和线,大家可以思考一下图像什么地方是点和线,也就是灰度变化较大的地方,两种灰度过渡的部分。于是我们就开始思考我们用一种什么属性去刻画图像中这些变化较大的特征,如果我们把一幅图像按照灰度值去扩大到三维,那么变化较大的地方就会形成一个“斜坡”或者是“悬崖”,这种情况就很好的用我们从初中开始学习的导数(微分)来去刻画它们,更加“陡峭”的地方导数就越大,更加“平缓”的地方导数就越小,“平坦”的区域导数就为零了。

在图像中我们每个点都是离散的,所以我们无法去定义连续的导数,于是我们就在离散情况下定义一阶和二阶微分。一维函数f(x)的一阶微分的基本定义是差值: f x = f ( x + 1 ) f ( x ) \frac{∂f}{∂x}=f(x+1)-f(x) 二阶微分定义为如下差分: 2 f x 2 = f ( x + 1 ) + f ( x 1 ) 2 f ( x ) \frac{∂^2f}{∂x^2}=f(x+1)+f(x-1)-2f(x)

3.3.2 拉普拉斯算子(二阶微分)

这里我们先学习一种各向同性滤波器,这种滤波器的响应与滤波器作用的图像的突变方向无关,也就是原图像旋转以后滤波处理的结果也是一样的。最简单的各向同性微分算子是拉普拉斯算子。一个二维图像函数f(x,y)的拉普拉斯算子定义为 2 f = 2 f x 2 + 2 f y 2 ▽^2f=\frac{∂^2f}{∂x^2}+\frac{∂^2f}{∂y^2} 同时我们也要定义离散拉普拉斯算子是 2 f ( x , y ) = f ( x + 1 , y ) + f ( x 1 , y ) + f ( x , y + 1 ) + f ( x , y 1 ) 4 f ( x , y ) ▽^2f(x,y)=f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y) 在这里插入图片描述
上图展示了三种拉普拉斯算子,最左边的算子表示上面定义的离散拉普拉斯算子,只不过取了一个负号,效果是相同的,但在将拉普拉斯算子滤波后的图像与其他图像合并时,必须要考虑符号上的差异,这也是为什么要取一个负值的原因。

matlab中预定义的二维线性空间滤波器,可通过函数 fspecial 实现:

f = imread('dog2.jpg');
figure;
subplot(1,2,1),imshow(f),title('Original image');
w = fspecial('laplacian',0);
g = imfilter(f,w,'replicate');
subplot(1,2,2),imshow(g),title('Laplace filtering');

在这里插入图片描述
如果仔细去看还是可以看出原图像中小狗的轮廓的,拉普拉斯算子增强主要是将算子得到的图像再叠加到原图像之上,这里叠加以后效果不明显我就不放出来了,感性的同学可以拿较暗的图片来进行一下锐化。

3.3.3 Sobel算子(一阶微分)

图像处理中的一阶微分是用梯度幅值来实现的,梯度也就是(x,y)处f的最大变换率的方向,向量▽f的幅值表示为M(x,y),即 M ( x , y ) = m a g ( f ) = g x 2 + g y 2 M(x,y)=mag(▽f)=\sqrt{g^2_x+g^2_y} 通常我们在实现中,使用绝对值来近似平方和平方根操作更适合于计算: M ( x , y ) g x + g y M(x,y)≈\left|g_x\right|+\left|g_y\right| 在这里插入图片描述
由上图两个sobel算子可以看出,sobel算子本身就是有方向的,我们去锐化图像时需要叠加不同方向上的一阶微分来求得梯度的幅值。

我们用与拉普拉斯算子同样的函数去处理得到一张梯度的幅值试一下:

w1 = fspecial('sobel');
g = imfilter(f,w1,'replicate');
figure;
subplot(1,2,1),imshow(f),title('Original image');
subplot(1,2,2),imshow(g),title('Sobel filtering');

在这里插入图片描述
就此我们可以看到梯度的幅值对于拉普拉斯算子来说比较明显,原因也是因为sobel算子从不同方向上去检测梯度的变化,因此sobel算子在边缘检测上起着重要的作用。

猜你喜欢

转载自blog.csdn.net/weixin_42939683/article/details/106474506