图像预处理(二值化)
本文的实验是主要通过opencv与python3实现,相关的代码可以在GitHub中找到。
1. 图像获取与灰度化
通过摄像头获取到的图像为彩色的图像。彩色图像主要分为两种类型,RGB及CMYK。其中RGB的彩色图像是由三种不同颜色成分组合而成,一个为红色,一个为绿色,另一个为蓝色。而CMYK类型的图像则由四个颜色成分组成:青C、品M、黄Y、黑CMYK类型的图像主要用于印刷行业。
每个图像的像素通常对应于二维空间中一个特定的位置,并且有一个或者多个与那个点相关的采样值组成数值。灰度图像,也称为灰阶图像,图像中每个像素可以由0(黑)到255(白)的亮度值(Intensity)表示。0-255之间表示不同的灰度级。
将彩色图像转化成为灰度图像的过程称为图像的灰度化处理。灰度化,在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255个值可取,这样一个像素点可以有1600多万(255255255)的颜色的变化范围。而灰度图像一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。对于灰度化的方式有分量法、最大值法、平均值法,加权平均法等。本文使用平均值法对图像进行灰度化。
对于平均值法,将彩色图像中的R、G、B三个分量的亮度求简单的平均值,将得到的值作为灰度值输出而得到灰度图。其实现的表达式如下:
通过实验得到得到如下图所示,灰度化前后:(实现代码)
2.二值化
通过以上对彩色图片进行灰度化以后,把获取到的灰度图像进行二值化处理。对于二值化,其目的是将目标用户背景分类,为后续车道的识别做准备。灰度图像二值化最常用的方法是阈值法,他利用图像中目标与背景的差异,把图像分别设置为两个不同的级别,选取一个合适的阈值,以确定某像素是目标还是背景,从而获得二值化的图像。
对于阈值法二值化,假设阈值设置为T,就可以以T为边界,把数值分为两个部分,则二值化的公式如下:
式中,Gray(i,j)表示在图片(i,j)处的灰度值,Ϝ(i,j)表示二值化后的值,只能取0或者1。在阈值二值化中,最主要的是选取合适的阈值,这也是二值化的难点所在。常用的二值化阈值选取方法有双峰法、p参数法、大律法(Otsu法)、最大熵阈值法、迭代法等。
2.1 双峰法选取阈值T
如果给定的图像的灰度分布是比较有规律,苗木表和背景在图像的直方图各自形成一个波峰,他们之间存在波谷。那么,阈值T可以在波谷取值,如下图所示:
实现的表达式如下:
式中,T表示阈值,Gray(i,j)表示原始图像的灰度值,G(i,j)表示二值化后的灰度值。通过实验获取得到的道路图像的直方图灰度分布,如图所示。
从图中可以看出,在道路图像二值化中不适合使用双峰法选取阈值。
2.2 P参数法选取阈值T
若已知目标区域的P值,则可以采用P参数的法进行分割。假设已知直方图中目标区域所占的比例为P_1,则该算法实现的步骤如下:
(1). 计算图像直方图的分布P(t),其中t = 0,1,2…255,表示图像的灰度值;
(2). 从t=0开始,计算图像的累积分布直方图,实现的表达式为:
(3). 计算阈值T
得到的T值也表示P_1最接近累积分布的灰度分布值t。
2.3 大律法(Otsu法)选取阈值T
Otsu算法的基本思想是用某一假定的灰度值t将图像的灰度分为两组,当两组的类间方差最大时,此灰度值t就是图像二值化的最佳阈值。假设图像有L个灰度值,那么灰度值的取值范围为0~L-1,在此范围内取灰度值T,将图像分成两组G_1和G_2其中G_1包含的像素值在0~T,G_2的灰度值在T+1~ L-1,用N表示图像图像像素总数,n_i表示灰度值为i的像素的个数。求值过程如下:假设每一个灰度值i出现的概率p_i= n_i/N,G_1和G_2两组像素个数在整体图像中所占的百分比为ω_1和ω_2,两组平均灰度值为μ_1和μ_2,则:
占比:
平均值灰度值:
图像总灰度值:
类间方差:
最佳阈值:获取类方差最大值时对应的灰度值t:
通过以上的步骤即可得到最佳的T值。
2.4 最大熵阈值法求T值
在信息论中的Shannon entropy概念用于图像分割,依据是使得图像中目标与背景分布的信息量最大,即通过测试图像灰度直方图的熵,找出最佳的阈值T。对于灰度值范围为0,1,2…L-1的图像,其直方图熵的定义为:
其中p_i为像素值为i的像素占整个图像的概率。设阈值t将图像划分为目标O和背景B两类,他们的概率分布分别为:
所以目标O和背景B的熵函数分别为:
其中,
图像的总熵为:
此方法不需要先验知识,而对非理想的双峰直方图也可以进行较好的分割,但不适合信噪比较低的图像分割。
通过实验,对灰度化的图像进行二值化后的效果如下,
可以自己调整阈值来到达更好的二值化效果。相关代码,与API在 GitHub中可以找到。
未完待续。