虽然现有很多机器学习算法能够准确地识别数字,但是传统方法对于一些需要离线识别且计算能力有限的下位机设备来说,仍然有非常不错的效果。因此,今天就向大家讲解一下传统的数字识别方法在仪表读数方面的应用。
1.图像预处理技术
1.1 主要流程
图像处理依次需要进行图片预处理、字轮区域定位、字符分割和字符识别等过程。其中图像处理流程如下图所示。
2. 详细过程
2.1 灰度化
为了减小图像原始数据量,本系统根据拍照获取的RGB565格式的16位彩色位图,首先通过位运算获取红色®、绿色(G)和蓝色(B)的数值,然后利用著名的心理学公式:
Gray = R ∗ 0.299 + G ∗ 0.587 + B ∗ 0.114 \text {Gray}=R^{*} 0.299+G^{*} 0.587+B^{*} 0.114 Gray=R∗0.299+G∗0.587+B∗0.114
然后将图像以8位灰度位图的形式保存下来。左图表示原水表字轮区域彩色图像,右图为灰度化之后的字轮区域图像。
2.2 边缘化
为了实现对字轮区域的准确定位和更好的识别效果,需要将字轮区域进行倾斜矫正,首先需要做的就是将图像的边缘信息提取出来。
本文采用的是Canny边缘检测算法,该算法的处理步骤可分为如下4步:高斯平滑、梯度计算、非极大值抑制、双阈值边缘检测。
图像中可能存在噪声,噪声可能会被误识别成边缘,因此,需要进行高斯平滑去除噪声。值得注意的是,模板越大,被识别的边缘越少,因此需要选择一个合理大小的高斯模板进行平滑处理。
本文采用Sobel算子是一个3x3的模板,包括一个对于垂直边缘响应最大的卷积核和一个对于水平边缘响应最大的卷积核。通过将图像中的每一个点都用这两个卷积核进行卷积,然后将两个方向卷积的最大值作为该点的输出值。Sobel算子模板如下图所示。
该卷积模板具有实现简单,运算速度快的特点。由Sobel算子模板可以算出每一点的梯度向量 ,可知梯度值G和方向
θ
\theta
θ为:
G
=
G
x
2
+
G
y
2
G=\sqrt{G_{x}^{2}+G_{y}^{2}}
G=Gx2+Gy2
θ = arctan ( G y G x ) \theta=\arctan \left(\frac{G_{y}}{G_{x}}\right) θ=arctan(GxGy)
经过上述处理后,可以得到一个粗边缘图像,还需要进行非极大值抑制处理才能得到定位准确的单像素的边缘。其具体步骤是将当前点的梯度与其梯度方向上梯度相比较,不是极大值,就将其置0。
经过上述进一步处理后的图像中还是存在着一些伪边缘,可以通过设置高低双阈值的方法去除它们。首先,若梯度值高于高阈值就置为255;若梯度值低于低阀值就置为0。接着,如果当前点的周围的梯度值都小于高阈值就将其置为0。算法边缘化处理后图像的最终效果如下图所示。
2.3 OTSU二值化
经过边缘化处理后,还是有些边缘比较杂乱,影响接下来的倾斜矫正过程。因此,还需要通过二值化处理来过滤一些杂乱的边缘。阈值的选择是二值化的关键。阈值太小,会把不需要的内容也一起提取出来;阈值过大则会丢失部分需要的数据。
本文采用的OTSU算法也称为最大类间方差法,其基本原理是将图像中的像素的灰度级按阈值划分为两类,两类间的方差越大,表明图像二值化效果越好。记
f
(
i
,
j
)
f(i, j)
f(i,j)为M×N图像
(
i
,
j
)
(i, j)
(i,j)点处的灰度值,灰度级为m,不妨假设
f
(
i
,
j
)
f(i, j)
f(i,j)取值[0,m-1]。记
p
(
k
)
p(k)
p(k)为灰度值为k的频率,则有:
p
(
k
)
=
1
M
N
∑
f
(
i
,
j
)
=
k
1
p(k)=\frac{1}{M N} \sum_{f(i, j)=k} 1
p(k)=MN1f(i,j)=k∑1
设使用t为阈值时的目标与背景分别为: { f ( i , j ) ≤ t } \{f(i, j) \leq t\} {f(i,j)≤t}和 { f ( i , j ) > t } \{f(i, j)>t\} {f(i,j)>t},于是:
目标部分比例: ω 0 ( t ) = ∑ 0 ≤ i ≤ t p ( i ) \omega_{0}(t)=\sum_{0 \leq i \leq t} p(i) ω0(t)=∑0≤i≤tp(i)
目标部分点数: N 0 ( t ) = M N ∑ 0 ≤ i ≤ t p ( i ) N_{0}(t)=M N \sum_{0 \leq i \leq t} p(i) N0(t)=MN∑0≤i≤tp(i)
背景部分比例: ω 1 ( t ) = ∑ t ≤ i ≤ m − 1 p ( i ) \omega_{1}(t)=\sum_{t \leq i \leq m-1} p(i) ω1(t)=∑t≤i≤m−1p(i)
背景部分点数: N 1 ( t ) = M N ∑ t ≤ i ≤ m − 1 p ( i ) N_{1}(t)=M N \sum_{t \leq i \leq m-1} p(i) N1(t)=MN∑t≤i≤m−1p(i)
目标均值: μ 0 ( t ) = ∑ 0 ≤ i ≤ t i p ( i ) ω 0 ( t ) \mu_{0}(t)=\frac{\sum_{0 \leq i \leq t} i p(i)}{\omega_{0}(t)} μ0(t)=ω0(t)∑0≤i≤tip(i)
背景均值: μ 1 ( t ) = ∑ t = i ≤ m − 1 i p ( i ) ω 1 ( t ) \mu_{1}(t)=\frac{\sum_{t=i \leq m-1} i p(i)}{\omega_{1}(t)} μ1(t)=ω1(t)∑t=i≤m−1ip(i)
总均值: μ = ω 0 ( t ) μ 0 ( t ) + ω 1 ( t ) μ 1 ( t ) \mu=\omega_{0}(t) \mu_{0}(t)+\omega_{1}(t) \mu_{1}(t) μ=ω0(t)μ0(t)+ω1(t)μ1(t)
图像最佳阈值g: g = Max 0 ≤ t ≤ m − 1 [ ω 0 ( t ) ( μ 0 ( t ) − μ ) 2 + ω ( t ) ( μ 1 ( t ) − μ ) 2 ] g=\operatorname{Max}_{0 \leq t \leq m-1}\left[\omega_{0}(t)\left(\mu_{0}(t)-\mu\right)^{2}+\omega(t)\left(\mu_{1}(t)-\mu\right)^{2}\right] g=Max0≤t≤m−1[ω0(t)(μ0(t)−μ)2+ω(t)(μ1(t)−μ)2]
将边缘化的图片进一步OTSU二值化后的图像如下图所示。
2.4 倾斜矫正
实际拍摄过程中,图像可能会有一定程度的倾斜,为了获得更好的识别效果,需要进行倾斜矫正处理。本文通过Hough变换检测出字轮区域上下边框直线,然后计算出该直线与水平轴的夹角作为倾斜角,最后根据倾斜角对图像进行旋转变换实现倾斜校正的目的。
Hough变换将直角坐标空间中的点映射到参数空间中[13]。在实际应用中,直线方程的斜率——截距式
y
−
m
x
−
c
=
0
y-m x-c=0
y−mx−c=0不能表示形如
x
=
a
x=a
x=a这种直线,因此为了解决垂直直线的斜率为无穷大这一问题,前人将极坐标引入霍夫变换,变换函数如下:
ρ
=
x
cos
θ
+
y
sin
θ
\rho=x \cos \theta+y \sin \theta
ρ=xcosθ+ysinθ
上式也可以表示成如下形式:
ρ
=
x
2
+
y
2
sin
(
θ
+
arctan
y
x
)
\rho=\sqrt{x^{2}+y^{2}} \sin \left(\theta+\arctan \frac{y}{x}\right)
ρ=x2+y2sin(θ+arctanxy)
其中, ρ \rho ρ为原点到直线的法线距离; θ \theta θ为该法线与X轴正方向所成夹角。这样,直角坐标系空间中任何一点 ( x i , y i ) \left(x_{i}, y_{i}\right) (xi,yi)将对应参数空间中的一条正弦曲线。对直角坐标系中所有的点进行霍夫变换后,再对参数空间求最大值,就可以获取到原直角坐标系中直线的参数。二维霍夫变换的过程如下图所示。
左图为直角坐标系,右图为参数空间。直角坐标系中同一条直线上的几个点转换到参数空间后对应于多条交于一个公共点正弦曲线,该点即包含原来直角坐标系中的直线的参数信息,如倾斜角、直线到原点之间的距离。获取到倾斜角度后就可以将图像进行旋转了,旋转后的图像如下图所示。
2.5 字轮区域精确定位
如前面所说,OTSU二值化可以很好地将背景和主要内容区分开,因此,将倾斜矫正后的图像再次进行灰度化、OTSU二值化等操作后,可以将图片的背景信息去除,效果如下所示。
然后根据白色点的分布,选取一个最小的矩形区域,使得白色点分布最大,同时矩形区域的面积尽可能地小。具体的算法如下图所示。
初始时从图像中心定义一个具有一定宽度和高度的小矩形区域,然后统计该矩形区域的白色点的个数。然后,通过向上改变矩形区域的上边框,扩大矩形区域的面积,统计此时矩形区域的白色点的个数。接着,比较前后两次矩形白色的增加个数是否大于给定的阈值。此时的阈值是为了排除个别噪声点的干扰。如果大于阈值,就接着向上改变矩形区域的上边框,然后统计白色点的个数,类似地,比较前后两次白色像素点的个数差值是否大于给定的阈值。最终,若前后两次的白色像素点的个数差值小于给定的阈值,则代表已经到了字轮区域的上边界,即字轮区域的上边界就是此时矩形区域的上边界。同理,可以确定字轮区域的下边界和左右边界。字轮区域精确定位后的效果如下图。
2.6 字轮区域字符分割
由于每个字轮是等宽的,所以字轮区域的字符分割就可以简单地采用按照宽度等比例切分的方案[19][20]。切分后的效果图如下图所示。
2.7 对比模板
通过与一些预先准备好的模板文件匹配,并利用一些特征信息,能够达到一定的识别效果。