灰度变换、直方图、卷积介绍及空间滤波器
内容简介
本篇文章主要介绍一些图像处理的基础,包括简单的灰度变换、直方图、卷积的简单介绍以及常见空间滤波器的介绍。
本篇内容主要知识来自冈萨雷斯第三版的《数字图像处理》,如对细节内容感兴趣的读者可以查阅相关书籍进行参考。本篇博文的内容与原书内容的顺序有所出入,如有不足欢迎留言指正,谢谢。
1. 灰度变换
众所周知,一幅常见的彩色图像通常是由M×N×3的矩阵表示的,其中M是图像的长度,N是图像的宽度,而3则代表三个颜色通道R,G,B(稍微提一下,opencv里读取图像默认的按B,G,R的顺序排序的)。通常,对图像的大部分操作并不需要用到彩色,因此将彩色图像转换为灰度图像是非常常见的。最常用的转换公式是: G r a y = 0.299 R + 0.587 G + 0.114 B Gray = 0.299R + 0.587G + 0.114B Gray=0.299R+0.587G+0.114B。
在图像转换为灰度图像后,就可以开始最基本的图像变换操作。以下子节都是建立在灰度图像的基础上进行操作的。其中, s s s 用来表示变换后的灰度值, r r r 用来表示变换前的灰度值, [ 0 , L − 1 ] [0,L-1] [0,L−1]表示灰度值的取值范围,通常L=256。
另外,需要说明的是,通常在灰度变换完毕后,需要对图像进行标准化,因为灰度变换的过程中,通常会出现小数或超过灰度范围255的数值,而最终图像需要正常显示,就需要将变换后的所有数据标准化到[0,255]的范围内。还需要注意的是,在编程过程中(尤其是python),要注意图像变量的数据类型,如果数据类型是整数,很可能在图像灰度值计算的过程中对浮点数进行了截断,使得计算结果很不准确。所以,在进行计算之前,要将图像变量从uint8型转换为float32或其他浮点型。
1.1 图像反转
s = L − 1 − r s=L-1-r s=L−1−r
简单来说就是黑白反转,有时候黑底作为背景图片更清晰,有时候白底更清晰,根据情况可进行选择。
1.2 对数变换
s = c log ( 1 + r ) s=c\log(1+r) s=clog(1+r)
其中,c 是可人为设置的常数。由于对数函数的性质,图像进行对数变换后,会将有较大动态范围(灰度级范围)的图像,压缩成动态范围较小的图像,且范围都比较集中于高亮度区域。
1.3 幂律(伽马)变换
s = c r γ s=cr^{\gamma} s=crγ
其中,c 和 γ \gamma γ 是正常数。当 γ < 1 \gamma<1 γ<1时,图像的直观效果是由暗变亮,和对数变换类似,此时图像灰度的动态范围被压缩;当 γ > 1 \gamma>1 γ>1时,图像的直观效果是由亮变暗,和对数变换相反,此时图像灰度的动态范围被扩展;
1.4 分段线性变换函数
其实可以根据实际情况,设置自己的灰度变换函数,对图像灰度值进行分段函数处理。常见的方式有:
1).对比度拉伸
2).灰度级分层
用来突出某段灰度范围的图像,而其他范围的灰度保持不变。极端一点的情况如上图左,就是阈值化处理,将不需要的部分全部删去,将留下的部分全部变白,从而产生二值图的效果。
3).比特平面分层
因为常见的灰度级都是 [ 0 , 2 8 − 1 ] [0,2^8-1] [0,28−1],由8个字节(bit)组成。那么我们将每个灰度值都划分为: G r a y = g 1 × 2 0 + g 2 × 2 1 + ⋯ + g 8 × 2 7 Gray=g_1×2^0+g_2×2^1+\dots+g_8×2^7 Gray=g1×20+g2×21+⋯+g8×27。然后利用所有像素的 g 1 g_1 g1组成一幅图像, g 2 g_2 g2组成一幅图像,以此类推。最终可以将原图像划分为8张图像,这8张图像就称为比特平面图像。以下是比特平面分层的效果图(图片源自《数字图像处理》,但是是从https://blog.youkuaiyun.com/be_solider/article/details/79114263博客中提供,其中博主将原图像灰度范围设定在[0,127],所以第8比特平面是全黑的)
2. 直方图
直方图其实就是以灰度等级为横轴,图像中该等级灰度值的个数为纵轴的图像。熟悉概率与统计的读者可以这样理解,是以像素灰度值为随机变量而绘制的离散概率密度函数(PDF)图像。
熟悉摄影的读者可能知道,图像如果要有较好的视觉感受,通常要要较高的对比度。而高对比度在直方图中,通常表现为图像的灰度值均匀地分布在每个灰度级上,即图像直方图趋近于水平线。用PS等软件可以很轻易地做到提高图像对比度,实际上提高图像对比度的操作在图像处理中叫做直方图均衡。
2.1 直方图均衡
要完成直方图均衡的操作,只需要进行如下灰度变换即可:
s = T ( r ) = ( L − 1 ) ∫ 0 r p r ( w ) d w 离 散 后 得 s k = T ( r k ) = ( L − 1 ) ∑ j = 0 k p r ( r j ) s=T(r)=(L-1)\int_0^r p_r(w)dw\quad离散后得s_k=T(r_k)=(L-1)\sum_{j=0}^k p_r(r_j) s=T(r)=(L−1)∫0rpr(w)dw离散后得sk=T(rk)=(L−1)j=0∑kpr(rj)
上式最后是将连续函数离散化后的结果。其中, p r ( r j ) = n j M N p_r(r_j)=\frac{n_j}{MN} pr(rj)=MNnj,表示某个灰度级 r j r_j rj在图像中出现的频率,而 n j n_j nj就是其频数。
推导过程?
由于直方图是PDF的近似,实际中直方图是离散的且不允许产生新的灰度级,因此,在计算中对得到的结果通常都是取就近的灰度值。因此,尽管进行了直方图均衡,最后得到的直方图也只是较为平缓,而不会是完全平坦的。
2.2 直方图匹配
直方图匹配的意思是,有时候并不希望简单地进行直方图均衡,而是希望图像的直方图尽量地靠近另一张图像的直方图或者是人为设计的直方图。这一过程就叫做直方图匹配。
假设,原图像的PDF是 p r ( r ) p_r(r) pr(r),想要匹配的直方图的PDF是 p z ( z ) p_z(z) pz(z)。那么,想要找到两者的变换,其实可以直接借用直方图均衡的操作作为桥梁,让原图像和匹配模板的图像都作直方图均衡化,理论上两者均衡化后的PDF应该是相同的,利用这一点建立等式关系,从而建立两者的转换关系。
s r = T r ( r ) = ( L − 1 ) ∫ 0 r p r ( w ) d w s_r=T_r(r)=(L-1)\int_0^r p_r(w)dw sr=Tr(r)=(L−1)∫0rpr(w)dw
s z = T z ( z ) = ( L − 1 ) ∫ 0 z p z ( w ) d w s_z=T_z(z)=(L-1)\int_0^z p_z(w)dw sz=Tz(z)=(L−1)∫0zpz(w)dw
∵ s z = s r ∴ z = T z − 1 [ T r ( r ) ] = T z − 1 ( s r ) ∵s_z=s_r\quad∴z=T_z^{-1}[T_r(r)]=T_z^{-1}(s_r) ∵sz=sr∴z=Tz−1