数字图像处理 第三章-1

chap03灰度变换和空间滤波

空间域指图像平面本身,空间域中的图处方法直接对图像中的像素进行操作。主要用于图像增强,图像增强是主观的,基于问题的。

灰度变换和空间滤波基础

直方图

MATLAB Tutorial

读取图像

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(Cumulative Density Function)

对于行向量:

CDF = cumsum(vec)

cumsum从左向右做类似 ∑ i = 0 k v e c ( i ) \sum_{i=0}^kvec(i) i=0kvec(i)的运算。

find

找到符合条件的下标

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)
对比度拉伸函数:

数字图像处理 第三章-1_第1张图片

显然,此函数将暗的变得更暗,亮的变得更亮。这种操作叫做对比度拉伸

阈值处理函数:
数字图像处理 第三章-1_第2张图片

此函数将图像变为二值图像,低于阈值的像素全0即全黑,高于阈值的像素全1最大即全白。

灰度变换

数字图像处理 第三章-1_第3张图片

图像反转

反转变换函数:
s = L − 1 − r s=L-1-r s=L1r
类似于照片底片,可用于增强图像暗色区域中的白色细节和灰色细节,暗色区域较大时这种增强效果很好。
数字图像处理 第三章-1_第4张图片

如上面两个图像是乳房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 01.5×106,为了在8比特系统上显示,线性压缩这些值,代价是损失频谱中的低值(低值很重要)。那么要增强该图片,可以施加一个对数变换:

数字图像处理 第三章-1_第5张图片

幂律(伽马)变换

s = c r γ s=cr^{\gamma} s=crγ
c , γ c,\gamma c,γ是正常数。与对数变换相同,幂律变换将较窄的暗输入映射到较宽的输出,将高输入的范围压缩。许多设备都遵从幂律响应。改变 γ \gamma γ的值就可以获得一族变换:

数字图像处理 第三章-1_第6张图片

例子1

原图:脊椎骨折

数字图像处理 第三章-1_第7张图片

处理后:

数字图像处理 第三章-1_第8张图片

三张图分别是 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_第9张图片

第一张图是原图,非常的苍白,这时施加一个幂律变换 ( γ > 1 ) (\gamma>1) (γ>1)可以压缩灰度级增强图像。后面三幅图 γ = 3 , 4 , 5 \gamma=3,4,5 γ=3,4,5 γ = 5 \gamma=5 γ=5时,跑道很清晰。

分段线性变换函数

事实上,有些重要的变换只能通过分段线性变换实现。

光照不足、成像传感器动态范围小、图像获取过程中镜头孔径设置错误等,都可能产生低对比度的图像。对比度拉伸可以扩展图像中的灰度级范围,使其显示理想图片。

一个典型的分段函数:

数字图像处理 第三章-1_第10张图片

( 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 r1r2,s1s2,保证是个单值单调递增函数,此时灰度级原本的顺序保持。

  • r 1 = r 2 , s 1 = 0 , s 2 = L − 1 r_1=r_2,s_1=0,s_2=L-1 r1=r2,s1=0,s2=L1那么该变换将创建一个二值图像
  • ( r 1 , s 1 ) = ( r m i n , 0 ) 和 ( r 2 , s 2 ) = ( r m a x , L − 1 ) (r_1,s_1)=(r_{min},0)和(r_2,s_2)=(r_{max},L-1) (r1,s1)=(rmin,0)(r2,s2)=(rmax,L1),该变换没有两边的灰度压缩,只有在整个灰度区间的线性拉伸。

举个栗子

原图:

数字图像处理 第三章-1_第11张图片

变个换:
数字图像处理 第三章-1_第12张图片

灰度级分层

为了突出图像中特定灰度区间,有两种常用的方法,感兴趣的灰度值给定一个值(如0),其他区间给另一个值(如1),产生一幅二值图像。还有一种是保持不感兴趣的灰度区间不变,给感兴趣的区间给一个定值:

数字图像处理 第三章-1_第13张图片

举个栗子

原图:

数字图像处理 第三章-1_第14张图片

transform:

数字图像处理 第三章-1_第15张图片

第一张图是用的第一种变换,突出了原本灰度级高的像素。第二张图用的第二种,将中等灰度级的像素调成了黑色。

比特平面分层

像素值是由比特组成的整数,例如,在一个256级灰度图中,像素值是由8比特组成的。

数字图像处理 第三章-1_第16张图片

可以通过只显示某个比特的像素(该像素段是1的像素值给1,不是给0)变为二值图像来查看哪些比特对整个图像的外观贡献较大

原图:

数字图像处理 第三章-1_第17张图片

数字图像处理 第三章-1_第18张图片

第一张图是原图,后面依次是第i个比特平面图像。可以明显看出后四个比特平面对图像的贡献较大,前三个更像白噪。那么可以用少量的贡献较大的几个比特平面压缩存储图像并用它们重建图像。
数字图像处理 第三章-1_第19张图片

以上三幅从上至下分别是用最后两个,三个,四个比特平面重建的图像。可以看到用最后四个平面效果还凑活,这样,压缩了一般的数据。

直方图(histogram)

r k , k = 0 , 1 , 2 , ⋯   , L − 1 r_k,k=0,1,2,\cdots,L-1 rk,k=0,1,2,,L1表示一幅 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,,L1
归一化直方图定义为
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
数字图像处理 第三章-1_第20张图片

从左到右分别是暗图像,亮图像,低对比度,高对比度图像的直方图。这里的直方图和通信原理中的直方图一样,不过就是采样点都是正规的整数点,和概率论中的概率质量函数也类似。

直方图均衡化

让直方图分布的均匀,人眼看起来就舒服。

先考虑连续情况:

图像的灰度可以看作区间 [ 0 , L − 1 ] [0,L-1] [0,L1]内的一个随机变量。还记得本章规定的灰度变换函数为 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} L11

求解:
p r ( r ) ∣ d r d s ∣ = 1 L − 1 p_r(r)|\dfrac{dr}{ds}|=\dfrac{1}{L-1} pr(r)dsdr=L11

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)=(L1)0rpr(w)dw0sL1
这个变换就是可以使直方图均衡化的变换!

离散直方图均衡化

对于离散值,用概率与求和函数替换概率密度值和积分:
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)=(L1)j=0kpr(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=00pr(rj)=7pr(r0)=1.33s1=T(r1)=7j=01pr(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.331s4=6.236s1=3.083s5=6.657s2=4.555s6=6.867s3=5.676s7=7.007
直方图,均衡化变换函数,变换后的直方图:

数字图像处理 第三章-1_第21张图片

可以看到,并不能让每个概率都相等,无所谓,我腾不出手。

举个栗子:

数字图像处理 第三章-1_第22张图片

最左边一列为原图,中间列为直方图均衡化后的图像,左右边一列为均衡化后的直方图。

数字图像处理 第三章-1_第23张图片

上图是四个图像直方图均衡化的变换函数。

直方图规定化

有时候,生成具有规定直方图的图像更好。暂时考虑连续灰度 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)=(L1)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)=(L1)0zpz(v)dv
由于变换函数 G G G一定是一个严格单增的函数,所以其有反函数!
z = G − 1 ( s ) = G − 1 [ T ( r ) ] z=G^{-1}(s)=G^{-1}[T(r)] z=G1(s)=G1[T(r)]
那么就得到了由 r r r z z z的变换函数。

然而,在离散灰度情况下,有一个四舍五入的操作,导致该函数基本上不是一个严格单增的函数,但是无伤大雅,用一个策略就可以屏蔽这个问题。

离散直方图规定化的过程:

  1. 计算输入图像的直方图 p r ( r ) p_r(r) pr(r),用直方图均衡化计算 s k s_k sk,四舍五入至区间 [ L − 1 ] [L-1] [L1]
  2. 对于 q = 0 , 1 , ⋯   , L − 1 q=0,1,\cdots,L-1 q=0,1,,L1,计算 G ( z q ) G(z_q) G(zq)的值,四舍五入后得到一个查询表,查询表中存的是从 z z z s s s的映射。
  3. s k , k = 0 , 1 , ⋯   , L − 1 s_k,k=0,1,\cdots,L-1 sk,k=0,1,,L1在查询表中反查 z z z,若有多个匹配,选择最小的值。(因为不是严格单增函数)
  4. 对整个图像的像素应用3

考虑一幅 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

数字图像处理 第三章-1_第24张图片

上方两图左图是原图直方图,右边是目标直方图。

下方两图左图是 G ( z ) G(z) G(z)函数,右图是规定化的直方图。

可以看到规定化直方图和目标直方图不一致,无所谓,调包侠会出手。

举个栗子,

原图:

数字图像处理 第三章-1_第25张图片

火星卫星表面,太暗了,给直方图均衡化一下:

数字图像处理 第三章-1_第26张图片

太亮了,八太行。这里要说一下除了太亮了之外为什么不行:前面说过一般照相设备的噪声大多产生在低灰度区间,这里直方图均衡化将低灰度区间拉伸到高灰度区间,拉伸的同时放大了噪声,所以更不行。观察原图直方图变换函数(下图),太高了,很低的灰度被映射到很高的灰度。再观察原图直方图有两个“峰”,一个在原点,另个在高灰度,这里可以用一个具有两个模态的高斯来近似原来的直方图(同时,将低灰度拉高一些),用这个目标直方图来规定化,如果原图有多个“峰”,则同样可以用多模态高斯函数来生成目标直方图。

数字图像处理 第三章-1_第27张图片

原图直方图与拟合出的双模太高斯函数(即目标直方图):
数字图像处理 第三章-1_第28张图片

规定化:

数字图像处理 第三章-1_第29张图片

局部直方图处理

以上的直方图处理都是全局的,这些方法适合于整体增强,但是当目的是增强图像中的几个小区域的细节时,通常会失败。解决方案是对像素的邻域进行直方图处理。

过程是这样的,定义一个领域,将其中心在水平方向或者垂直方向上从一个像素移动到另一个像素。在每个位置,计算邻域中的各点的直方图,进行均衡化或者规定化。通常移动步长为1。

举个栗子

原图:

数字图像处理 第三章-1_第30张图片

下面三个图像分别是原图,全局直方图均衡化与局部直方图均衡化图像:
数字图像处理 第三章-1_第31张图片

可以看到第三个局部直方图均衡化的图像细节显露出来了。

那么,应该选取哪些像素进行局部直方图处理呢,主要有两方面的考虑

  • 灰度

    确定某个像素是否需要处理,是用平均局部灰度和平均全局灰度进行比较的。

    平均局部灰度为 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 k0mSxyk1,其中 k 0 < k 1 k_0k0<k1 k 0 , k 1 k_0,k_1 k0,k1非负,比如,如果想处理所有比平均灰度的 1 / 4 1/4 1/4更暗的地方,则 k 0 = 0 , k 1 = 0.25 k_0=0,k_1=0.25 k0=0,k1=0.25

  • 对比度

    确定某个像素是否需要处理,也可以用区域的对比度与全局对比度来决定。

    首先说明对比度的测度:

    对于灰度级在区间 [ L − 1 ] [L-1] [L1]内的图像,灰度值 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=0L1(rim)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=0L1rip(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=0L1(rim)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σSxyk4σG来确定,同样 k 3 < k 4 k_3k3<k4且非负。

你可能感兴趣的:(matlab,计算机视觉,图像处理)