空间域指图像平面本身,空间域中的图处方法直接对图像中的像素进行操作。主要用于图像增强,图像增强是主观的,基于问题的。
灰度变换和空间滤波基础
直方图
img = imread('imgPath')
将图像读入矩阵img。
imshow(img)
MATLAB中灰度图读入后是uint8类型,但是有时候处理需要先将数据类型转为double类型并归一化(和神经网络中的相同,不然容易上溢)。有两个函数可以自动转换并归一化。
转double并归一化:
img2 = im2double(img)%效果等同于double(img)/255
转uint8并反归一化:
img2 = im2uint8(img)
[M,N] = size(img)
M为行数,N为列数
NumPixels = numel(img)
有个函数可以获取直方图并且画出其非归一化直方图:
g = imhist(img)
直方图均衡化,规定化:
g = histeq(img, ps)%ps是目标直方图行向量,如果ps=256就是直方图均衡化
局部直方图均衡化:
g = adapthisteq(img, 'NumTiles', [25,25],...)
这个得看看帮助文档。
对于行向量:
CDF = cumsum(vec)
cumsum
从左向右做类似 ∑ i = 0 k v e c ( i ) \sum_{i=0}^kvec(i) ∑i=0kvec(i)的运算。
找到符合条件的下标
index = find(条件)%条件比如img=255,找出img中所有像素值为255的下标
很多作图的跟matplotlib差不多,matplotlib就是MATLAB过去的。
空间域处理基于表达式
g ( x , y ) = T [ f ( x , y ) ] g(x,y)=T[f(x,y)] g(x,y)=T[f(x,y)]
其中 f ( x , y ) f(x,y) f(x,y)是输入图像, g ( x , y ) g(x,y) g(x,y)是输出图像, T T T是在点 ( x , y ) (x,y) (x,y)的一个邻域上定义的针对输入图像的算子。
计算的过程是针对一个像素 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),对该像素与其邻域施加算子 T T T。针对的像素从原点开始,逐个像素移动直至所有像素都被计算过一遍。最小的邻域为 1 × 1 1\times1 1×1。此时 g g g只依赖于 ( x , y ) (x,y) (x,y)处的 f f f值,此时 T T T称为灰度变换函数,因为只针对一个像素点,也称作点处理技术,是相对与之前的邻域处理技术而言的。
s = T ( r ) s=T(r) s=T(r)
对比度拉伸函数:
显然,此函数将暗的变得更暗,亮的变得更亮。这种操作叫做对比度拉伸。
此函数将图像变为二值图像,低于阈值的像素全0即全黑,高于阈值的像素全1最大即全白。
反转变换函数:
s = L − 1 − r s=L-1-r s=L−1−r
类似于照片底片,可用于增强图像暗色区域中的白色细节和灰色细节,暗色区域较大时这种增强效果很好。
如上面两个图像是乳房X射线图像,第二张是第一张的反转变换结果。可以看出增强了细节。
s = c l o g ( 1 + r ) s=clog(1+r) s=clog(1+r)
c是常数。这个灰度变换函数,将较窄的低灰度值映射到较宽较高灰度值,将较宽的高灰度值压缩到较窄的高灰度值。反对数变换则功能与此函数正好相反。幂律函数性转与此类似,类似这样形状的变换函数都可以压缩/放大动态范围。
如:傅里叶频谱的动态范围为 0 ∼ 1.5 × 1 0 6 0\sim1.5\times10^6 0∼1.5×106,为了在8比特系统上显示,线性压缩这些值,代价是损失频谱中的低值(低值很重要)。那么要增强该图片,可以施加一个对数变换:
s = c r γ s=cr^{\gamma} s=crγ
c , γ c,\gamma c,γ是正常数。与对数变换相同,幂律变换将较窄的暗输入映射到较宽的输出,将高输入的范围压缩。许多设备都遵从幂律响应。改变 γ \gamma γ的值就可以获得一族变换:
例子1
原图:脊椎骨折
处理后:
三张图分别是 c = 1 , γ = 0.6 , 0.4 , 0.3 c=1,\gamma=0.6,0.4,0.3 c=1,γ=0.6,0.4,0.3,显然骨折处的效果不一样。 γ = 0.4 \gamma=0.4 γ=0.4时增强效果最好, γ = 0.3 \gamma=0.3 γ=0.3时图像的对比度就比较低了,不太好。
例子2
第一张图是原图,非常的苍白,这时施加一个幂律变换 ( γ > 1 ) (\gamma>1) (γ>1)可以压缩灰度级增强图像。后面三幅图 γ = 3 , 4 , 5 \gamma=3,4,5 γ=3,4,5, γ = 5 \gamma=5 γ=5时,跑道很清晰。
事实上,有些重要的变换只能通过分段线性变换实现。
光照不足、成像传感器动态范围小、图像获取过程中镜头孔径设置错误等,都可能产生低对比度的图像。对比度拉伸可以扩展图像中的灰度级范围,使其显示理想图片。
一个典型的分段函数:
将 ( r 1 , s 1 ) 和 ( r 2 , s 2 ) (r_1,s_1)和(r_2,s_2) (r1,s1)和(r2,s2)中间的灰度级展开,一般的 r 1 ⩽ r 2 , s 1 ⩽ s 2 r_1\leqslant r_2,s_1\leqslant s_2 r1⩽r2,s1⩽s2,保证是个单值单调递增函数,此时灰度级原本的顺序保持。
举个栗子
原图:
为了突出图像中特定灰度区间,有两种常用的方法,感兴趣的灰度值给定一个值(如0),其他区间给另一个值(如1),产生一幅二值图像。还有一种是保持不感兴趣的灰度区间不变,给感兴趣的区间给一个定值:
举个栗子
原图:
transform:
第一张图是用的第一种变换,突出了原本灰度级高的像素。第二张图用的第二种,将中等灰度级的像素调成了黑色。
像素值是由比特组成的整数,例如,在一个256级灰度图中,像素值是由8比特组成的。
可以通过只显示某个比特的像素(该像素段是1的像素值给1,不是给0)变为二值图像来查看哪些比特对整个图像的外观贡献较大
原图:
第一张图是原图,后面依次是第i个比特平面图像。可以明显看出后四个比特平面对图像的贡献较大,前三个更像白噪。那么可以用少量的贡献较大的几个比特平面压缩存储图像并用它们重建图像。
以上三幅从上至下分别是用最后两个,三个,四个比特平面重建的图像。可以看到用最后四个平面效果还凑活,这样,压缩了一般的数据。
令 r k , k = 0 , 1 , 2 , ⋯ , L − 1 r_k,k=0,1,2,\cdots,L-1 rk,k=0,1,2,⋯,L−1表示一幅 L L L灰度级的数字图像 f ( x , y ) f(x,y) f(x,y)的灰度。 f f f的非归一化直方图定义为
h ( r k ) = n k , k = 0 , 1 , 2 , ⋯ , L − 1 h(r_k)=n_k,\qquad k=0,1,2,\cdots,L-1 h(rk)=nk,k=0,1,2,⋯,L−1
归一化直方图定义为
p ( r k ) = h ( r k ) M N = n k M N p(r_k)=\dfrac{h(r_k)}{MN}=\dfrac{n_k}{MN} p(rk)=MNh(rk)=MNnk
从左到右分别是暗图像,亮图像,低对比度,高对比度图像的直方图。这里的直方图和通信原理中的直方图一样,不过就是采样点都是正规的整数点,和概率论中的概率质量函数也类似。
让直方图分布的均匀,人眼看起来就舒服。
先考虑连续情况:
图像的灰度可以看作区间 [ 0 , L − 1 ] [0,L-1] [0,L−1]内的一个随机变量。还记得本章规定的灰度变换函数为 s = T ( r ) s=T(r) s=T(r),r是变换前的灰度,s是变换后的, T T T为变换函数。令 p s ( s ) 和 p r ( r ) p_s(s)和p_r(r) ps(s)和pr(r)表示不同图像s,r的PDF,根据概率分布函数定义:
F s ( s ) = ∫ − ∞ s p s ( s ) d s = ∫ − ∞ r p r ( r ) d r F_s(s)=\int_{-\infty}^sp_s(s)ds=\int_{-\infty}^rp_r(r)dr Fs(s)=∫−∞sps(s)ds=∫−∞rpr(r)dr
两边同时对s求导:
p s ( s ) = d [ ∫ − ∞ r p r ( r ) d r ] d s = d [ ∫ − ∞ r p r ( r ) d r ] d r d r d s = p r ( r ) ∣ d r d s ∣ p_s(s)=\dfrac{d[\int_{-\infty}^rp_r(r)dr]}{ds}=\dfrac{d[\int_{-\infty}^rp_r(r)dr]}{dr}\dfrac{dr}{ds}=p_r(r)|\dfrac{dr}{ds}| ps(s)=dsd[∫−∞rpr(r)dr]=drd[∫−∞rpr(r)dr]dsdr=pr(r)∣dsdr∣
那么,直方图均衡化的目标是将PDF– p s ( s ) ps(s) ps(s)变成一个常数 1 L − 1 \dfrac{1}{L-1} L−11:
求解:
p r ( r ) ∣ d r d s ∣ = 1 L − 1 p_r(r)|\dfrac{dr}{ds}|=\dfrac{1}{L-1} pr(r)∣dsdr∣=L−11
即
s = T ( r ) = ( L − 1 ) ∫ 0 r p r ( w ) d w 0 ⩽ s ⩽ L − 1 s=T(r)=(L-1)\int_0^rp_r(w)dw\qquad 0\leqslant s\leqslant L-1 s=T(r)=(L−1)∫0rpr(w)dw0⩽s⩽L−1
这个变换就是可以使直方图均衡化的变换!
离散直方图均衡化
对于离散值,用概率与求和函数替换概率密度值和积分:
p r ( r k ) = n k M N s k = T ( r k ) = ( L − 1 ) ∑ j = 0 k p r ( r j ) p_r(r_k)=\dfrac{n_k}{MN}\\ s_k=T(r_k)=(L-1)\sum_{j=0}^kp_r(r_j) pr(rk)=MNnksk=T(rk)=(L−1)j=0∑kpr(rj)
举例:
假设一幅大小为 64 × 64 64\times64 64×64大小的3比特图像(L=8),灰度分布如下:
r k r_k rk | n k n_k nk | p r ( r k ) = n k / M N p_r(r_k)=n_k/MN pr(rk)=nk/MN |
---|---|---|
r 0 = 0 r_0=0 r0=0 | 790 | 0.19 |
r 1 = 1 r_1=1 r1=1 | 1023 | 0.25 |
r 2 = 2 r_2=2 r2=2 | 850 | 0.21 |
r 3 = 3 r_3=3 r3=3 | 656 | 0.16 |
r 4 = 4 r_4=4 r4=4 | 329 | 0.08 |
r 5 = 5 r_5=5 r5=5 | 245 | 0.06 |
r 6 = 6 r_6=6 r6=6 | 122 | 0.03 |
r 7 = 7 r_7=7 r7=7 | 81 | 0.02 |
s 0 = T ( r 0 ) = 7 ∑ j = 0 0 p r ( r j ) = 7 p r ( r 0 ) = 1.33 s 1 = T ( r 1 ) = 7 ∑ j = 0 1 p r ( r j ) = 7 [ p r ( r 0 ) + p r ( r 1 ) ] = 3.08 下略 s_0=T(r_0)=7\sum_{j=0}^0p_r(r_j)=7p_r(r_0)=1.33\\ s_1=T(r_1)=7\sum_{j=0}^1p_r(r_j)=7[p_r(r_0)+p_r(r_1)]=3.08\\ 下略 s0=T(r0)=7j=0∑0pr(rj)=7pr(r0)=1.33s1=T(r1)=7j=0∑1pr(rj)=7[pr(r0)+pr(r1)]=3.08下略
可得:
s 0 = 1.33 → 1 s 4 = 6.23 → 6 s 1 = 3.08 → 3 s 5 = 6.65 → 7 s 2 = 4.55 → 5 s 6 = 6.86 → 7 s 3 = 5.67 → 6 s 7 = 7.00 → 7 s_0=1.33\to1\quad s_4=6.23\to6\\ s_1=3.08\to3\quad s_5=6.65\to7\\ s_2=4.55\to5\quad s_6=6.86\to7\\ s_3=5.67\to6\quad s_7=7.00\to7 s0=1.33→1s4=6.23→6s1=3.08→3s5=6.65→7s2=4.55→5s6=6.86→7s3=5.67→6s7=7.00→7
直方图,均衡化变换函数,变换后的直方图:
可以看到,并不能让每个概率都相等,无所谓,我腾不出手。
举个栗子:
最左边一列为原图,中间列为直方图均衡化后的图像,左右边一列为均衡化后的直方图。
上图是四个图像直方图均衡化的变换函数。
有时候,生成具有规定直方图的图像更好。暂时考虑连续灰度 r , z r,z r,z,PDF分别为 p r ( r ) , p z ( z ) p_r(r),p_z(z) pr(r),pz(z), p z ( z ) p_z(z) pz(z)是目标图像的PDF,将图像的PDF由 p r ( r ) p_r(r) pr(r)变为 p z ( z ) p_z(z) pz(z)的过程称为直方图规定化。
由直方图均衡化可知:
s = T ( r ) = ( L − 1 ) ∫ 0 r p r ( w ) d w s=T(r)=(L-1)\int_0^rp_r(w)dw s=T(r)=(L−1)∫0rpr(w)dw
那么,对于 z z z,也对其进行直方图均衡化:
s = G ( z ) = ( L − 1 ) ∫ 0 z p z ( v ) d v s=G(z)=(L-1)\int_0^zp_z(v)dv s=G(z)=(L−1)∫0zpz(v)dv
由于变换函数 G G G一定是一个严格单增的函数,所以其有反函数!
z = G − 1 ( s ) = G − 1 [ T ( r ) ] z=G^{-1}(s)=G^{-1}[T(r)] z=G−1(s)=G−1[T(r)]
那么就得到了由 r r r到 z z z的变换函数。
然而,在离散灰度情况下,有一个四舍五入的操作,导致该函数基本上不是一个严格单增的函数,但是无伤大雅,用一个策略就可以屏蔽这个问题。
离散直方图规定化的过程:
考虑一幅 64 × 64 64\times64 64×64的3比特图像,有一个直方图规定化任务如下:
z q z_q zq | p z ( z q ) p_z(z_q) pz(zq) | p r ( r k ) p_r(r_k) pr(rk) |
---|---|---|
z 0 = 0 z_0=0 z0=0 | 0.00 | 0.19 |
z 1 = 1 z_1=1 z1=1 | 0.00 | 0.25 |
z 2 = 2 z_2=2 z2=2 | 0.00 | 0.21 |
z 3 = 3 z_3=3 z3=3 | 0.15 | 0.15 |
z 4 = 4 z_4=4 z4=4 | 0.20 | 0.09 |
z 5 = 5 z_5=5 z5=5 | 0.30 | 0.06 |
z 6 = 6 z_6=6 z6=6 | 0.20 | 0.04 |
z 7 = 7 z_7=7 z7=7 | 0.15 | 0.01 |
上方两图左图是原图直方图,右边是目标直方图。
下方两图左图是 G ( z ) G(z) G(z)函数,右图是规定化的直方图。
可以看到规定化直方图和目标直方图不一致,无所谓,调包侠会出手。
举个栗子,
原图:
火星卫星表面,太暗了,给直方图均衡化一下:
太亮了,八太行。这里要说一下除了太亮了之外为什么不行:前面说过一般照相设备的噪声大多产生在低灰度区间,这里直方图均衡化将低灰度区间拉伸到高灰度区间,拉伸的同时放大了噪声,所以更不行。观察原图直方图变换函数(下图),太高了,很低的灰度被映射到很高的灰度。再观察原图直方图有两个“峰”,一个在原点,另个在高灰度,这里可以用一个具有两个模态的高斯来近似原来的直方图(同时,将低灰度拉高一些),用这个目标直方图来规定化,如果原图有多个“峰”,则同样可以用多模态高斯函数来生成目标直方图。
规定化:
以上的直方图处理都是全局的,这些方法适合于整体增强,但是当目的是增强图像中的几个小区域的细节时,通常会失败。解决方案是对像素的邻域进行直方图处理。
过程是这样的,定义一个领域,将其中心在水平方向或者垂直方向上从一个像素移动到另一个像素。在每个位置,计算邻域中的各点的直方图,进行均衡化或者规定化。通常移动步长为1。
举个栗子
原图:
下面三个图像分别是原图,全局直方图均衡化与局部直方图均衡化图像:
可以看到第三个局部直方图均衡化的图像细节显露出来了。
那么,应该选取哪些像素进行局部直方图处理呢,主要有两方面的考虑
灰度
确定某个像素是否需要处理,是用平均局部灰度和平均全局灰度进行比较的。
平均局部灰度为 m S x y m_{S_{xy}} mSxy,平均全局灰度 m G m_G mG。
增强图像方案的第一个要素: k 0 ⩽ m S x y ⩽ k 1 k_0\leqslant m_{S_{xy}}\leqslant k_1 k0⩽mSxy⩽k1,其中 k 0 < k 1 k_0
对比度
确定某个像素是否需要处理,也可以用区域的对比度与全局对比度来决定。
首先说明对比度的测度:
对于灰度级在区间 [ L − 1 ] [L-1] [L−1]内的图像,灰度值 r r r相对于其均值 m m m的第n阶矩定义为:
μ n = ∑ i = 0 L − 1 ( r i − m ) n p ( r i ) \mu_n=\sum_{i=0}^{L-1}(r_i-m)^np(r_i) μn=i=0∑L−1(ri−m)np(ri)
其中m为:
m = ∑ i = 0 L − 1 r i p ( r i ) m=\sum_{i=0}^{L-1}r_ip(r_i) m=i=0∑L−1rip(ri)
方差(二阶矩)是图像对比度的测度:
σ 2 = μ 2 = ∑ i = 0 L − 1 ( r i − m ) 2 p ( r i ) \sigma^2=\mu_2=\sum_{i=0}^{L-1}(r_i-m)^2p(r_i) σ2=μ2=i=0∑L−1(ri−m)2p(ri)
设局部标准差为 σ S x y \sigma_{S_{xy}} σSxy,全局标准差为 σ G \sigma_G σG。那么某个像素是否被选取可以用 k 3 σ G ⩽ σ S x y ⩽ k 4 σ G k_3\sigma_G\leqslant\sigma_{S_xy}\leqslant k_4\sigma_G k3σG⩽σSxy⩽k4σG来确定,同样 k 3 < k 4 k_3