本发明属于图像处理,具体涉及一种去环境干扰的多仪表盘自动读数方法。
背景技术:
随着社会与科技的发展,电子化深入到生活和工业生产各个领域,市场上一出现了各种电子读数仪表,但传统的指针式仪表还是占据着巨大的市场。目前对仪表的检测还主要停留在人工读数,现有的对指针式仪表自动读数的方法存在以下几点不足:
1、一次只能对单个仪表进行读数,效率相对较低。现在好多设备上都是集合多个指针式仪表的,如果一对一进行识别,必然增加成本、降低效率。
2、已有的方法中只是简单地对噪声进行处理,并没有考虑到太阳光反射、水汽、褪色等环境因素带来的信息缺失,在精确检测中会带来读数的误差。
3、采用角度法对指针式仪表读数存在比较大的误差,如果是大范围的按比例来计算读数,则对角度测量的微小误差都会被放大。
技术实现要素:
发明目的:针对上述现有技术的不足,本发明提供一种去环境干扰的多仪表盘自动读数方法,主要解决现有仪表受环境干扰影响大,读数不准确问题,提供一种读数方法。
技术方案:一种去环境干扰的多仪表盘自动读数方法,其特征在于,包括以下步骤:
(1)采集包含多个仪表盘的图像并传送到电脑或者图像处理设备上,采集设备包括高清ccd摄像头;
(2)对步骤(1)采集到的图像进行预处理,预处理包括对图像依次进行灰度化处理、中值化滤波、去除噪声、对比度拉伸、二值化处理;
(3)用houghcircles函数对图像中的圆形仪表盘进行检测和处理;
(4)将步骤(3)检测得到的所有圆形仪表盘图像中提取出单个表盘图像,并依次按1、2、3……顺序编号;
(5)识别表盘图像特征信息,包括指针信息的识别和刻度信息的识别;将指针和刻度线转换为直线上的分布,使下一步的读书更加便捷;
(6)检查步骤(5)指针和刻度线转化成直线后的分布,对在环境因素(如阳光、水汽)造成的刻度线缺失进行修复;
(7)根据之前步骤获取的图像信息进行读数识别,识别采用分段读取法,先读取大范围的读数,然后再加上小范围内的读数,提高读数的准确度
进一步的,所述步骤(2)中对图像进行预处理的方法包括以下步骤:
(2a)灰度化处理:在灰度图像中,r(红)、g(绿)、b(蓝)这三种分量的亮度都相同,属于同一级,其范围用0—255级表示。其中0级表示像素点最暗,为纯黑色,255级表示该点最亮,为纯白色。下面的公式为将彩色像素点转换为灰度值的公式:
i=0.299r+0.587g+0.114b
(2b)中值滤波,去除噪声:光线的照射、表盘上的灰层等环境因素都会给图像信号带来噪声,本方法中采用中值滤波法去除噪声。中值滤波法采用的是非线性信号处理的方法,该方法的优点是既去除掉图像中的噪声又不会破坏图像的边缘。
中值滤波法的步骤如下:
(a)选取中值滤波器的窗口,因为指针和刻度处有尖角,所以选择适应于处理有尖角特征图像的十字形滤波窗口,窗口的大小不定,通过不断试验选择最佳的效果。然后按照从左往右,从上往下的顺序进行排列,求的这些像素点的中值作为中心点的新的灰度值。
(b)将中值滤波器窗口移动到一个新的位置,将相邻的点的灰度值按从大到小的顺序进行排列,求出这些像素点的中心点作为新的灰度值。
(c)对表盘图像中的每一个像素点都执行以上的步骤,最后重新赋予新的灰度值的图就构成了所需的滤波后的灰度图。
(2c)对比度拉伸:对比度拉伸也叫灰度拉伸,主要思想是提高图像处理时灰度级的动态范围,如果所采集到的图像的灰度集中在较暗区域导致图像偏暗,可以用灰度拉伸功能来拉伸物体灰度区间以改善图像;如果所采集到的图像集中在较亮的区域而导致图像偏亮,也可以用灰度拉伸功能来压缩物体灰度区间以改善图像。
(2d)二值化处理:为了图像处理更加方便,快捷,对图像进行二值化处理。首先需要确定一个二值化的阈值,然后把所有高于阈值的像素点设置为“1”,把低于阈值的像素点设置为“0”。这样图像就变成了只有两个量化值的黑白图像。阈值的确定采用最大类间方差法即可实现很好地效果。
进一步的,所述步骤(3)中对图像进行圆检测的具体方法为:市场上圆形仪表盘占据着很大的市场,所以方法中采用霍夫变换中houghcircles函数对圆形轮廓进行检测,检测的步骤如下:
(3a)检测圆心,圆心是该圆所有法线的交汇点,所以只要找到这个交汇点即可。先对采集到的图边缘进行检测,然后确定圆周线,在二维霍夫空间内绘出所有的法线,某个点上累加的值越大,则该点为圆心的概率越大,设定一个阈值,当大于该阈值时则认定为圆心,如果小于该阈值则不是圆心。阈值的大小需要根据与预期结果的误差调整,直至圆心的位置与实际表盘中心重合。
(3b)检测圆半径,计算步骤(3a)中检测到的圆心到所有圆周线的距离,这些距离中包括该圆心所对应的圆的半径。为了提高识别的准确率,设定两个阈值,一个定义为最大半径max_radius,大小为图像宽度和长度的最大值;另一个定义为最小半径min_radius,初始化为0,圆心到圆周线的距离应该都大于min_radius小于max_radius的值,最后设定一个阈值d,如果相同距离的数量大于该阈值d,则该距离即为所测圆心的半径,最后得出来的半径的值一定在[min_radius,max_radius]区间内。
(3c)步骤(3a)、(3b)在通过调用opencv中的houghcircles函数时实现所述两个步骤,阈值d的值并不固定,首先为阈值d设置一个初始值50,如果没有检测出半径,则减小阈值;如果检测出多条不同值的半径,则增大阈值,直到该阈值检测出准确唯一的半径。检测出采集到的图像中所包含的圆的个数即表盘的数目。
进一步的,所述步骤(4)中获取单个仪表盘的具体方法为:在步骤(3)中已经确定了各个表盘的圆心,以圆心为中心,以圆心对应的半径r乘以2再加上d为边长作出正方形,d的的大小为实际表盘间最小距离长度的一半。所以该正方形一定包含该圆心对应的表盘,获取步骤(4a)中得到的正方形区域并标记为1,重复步骤(4a),直至截取出采集的图像中所有的圆形表盘图像按1、2、3……顺序标记出正方形区域,待后面的读数识别处理。。
进一步的,所述步骤(5)中图像特征信息的提取的具体方法为:
(5a)刻度线检测:刻度线的检测采用hough变换,用houghlinesp函数检测直线,并将并将处理过后的单个表盘图像中的刻度线转换成该刻度线区域中像素点累加峰值计算。因为刻度线和指针都是直线,所以在检测过程中要对直线进行条件限制。同时,在函数中设定一个阈值作为刻度线的像素最大值,用于区分开刻度线和指针两种直线,因为刻度线的长度短于指针线,所以检测到的直线的像素和小于等于该阈值,如果超过的阈值则为指针线。然后将每条刻度线都映射到步骤(3)检测到的圆弧上,并用θ表示该映射点和起始点之间的夹角,用s表示像素的灰度值和,即每一个刻度可用(θ,s)表示。
(5b)指针检测:指针检测同样采用houghlinesp函数进行检测,,为了区分开刻度线和指针两种直线,如(5a)中一样设置一个阈值。因为仪表的指针长度肯定比刻度线要长很多,所以设置一个阈值,所检测到的指针线的像素和必须大于该阈值。指针线也映射到圆弧上,设映射到的点与刻度初始点的夹角为θi。
(5c)圆弧转换:仪表中的刻度构成一段圆弧,(5a)和(5b)两个步骤已经把所有的刻度线和指针线映射到了圆弧上,通过以下公式可以把所有的点都转换到一条x轴上:
其中,θ表示映射点与起始点的夹角,r表示圆的半径,x表示在x轴上的长度。
这样所有的刻度之间都应该是等间距分布在x轴上。
进一步的,所述步骤(6)中图像特征信息的修复的具体方法为:因为光线水汽等环境因素可能造成刻度线的缺失,为了准确的读数,利用刻度线之间间距相等的原理补全缺失的刻度。首先通过公式
进一步的,所述步骤(7)中读数识别的具体方法为:经过步骤(5)和(6)已经对刻度线进行补全并将所有的刻度线和指针映射在一条x轴上。为了更加准确地读数,首先确定指针在x轴上的位置,然后根据指针的位置确定前一个刻度所代表的仪表上的读数l,设仪表的总量程为s,则每个间隔代表
有益效果:本发明与现有技术相比,显著的优势在于:第一、本发明增加了指针式仪表检测的效率,解决了传统单个仪表检测的成本增加和低效率;第二、本发明在对仪表进行读数时,对仪表刻度的修复减少了环境因素带来的影响;第三、本发明读数算法简单便捷,采用大范围刻度读取加小范围比例读取的方法,增加来读数的精确度。
附图说明
图1是本发明所述方法步骤流程图;
图2是本发明的硬件设备组成框图;
图3为本发明图像预处理过程的流程图;
图4为本发明hough圆检测并获取单个仪表盘图像的流程图;
图5为本发明的对单个表盘读数自动识别过程的流程图。
具体实施例
为了详细的说明本发明公开的技术方案,下面结合说明书附图和具体实施例做进一步的阐述。本实施例仅作为优选,不作为本发明保护范围的限制。
实施本发明的方法流程图如附图1所示,开始后先采集包含多个仪表盘的图像,然后对图像进行一系列预处理,包括灰度化处理、中值滤波、对比度拉伸和二值化处理。接着对图像中的圆进行检测,获取单个仪表盘图像并按1、2、3……编号。对每个仪表盘图像进行图像特征信息提取,包括检测刻度线和指针线。如果存在指针缺失的情况,则对指针进行补全。最后对修复完的图像进行读数识别。
实施本发明的硬件设备框图如附图2所示,主要包括ccd摄像头,计算机和显示器,另外如果有需求报警或者打印数据的话可以外加报警器和打印机。实施过程中通过ccd摄像头采集包含多个指针仪表的图像,然后将图像传送到电脑。通过电脑上的程序对图像进行图像预处理、hough圆检测、图像特征信息提取及修复和读数识别一系列处理,最后再将读数结果发送到显示器上显示。
实施本发明过程中图像预处理的实施方法如附图3所示。
1.灰度化处理:将采集到的彩色图片转换为数字化的灰度图像,在灰度图像中,r(红)、g(绿)、b(蓝)这三种分量的亮度都相同,属于同一级,其范围用0—255级表示。其中0级表示像素点最暗,为纯黑色,255级表示该点最亮,为纯白色。通过公式i=0.299r+0.587g+0.114b可以将彩色像素点转换为灰度值。
2.中值滤波,去除噪声:为了去除掉图像中噪音的干扰又可以保证图像的边缘不受到破坏,采用中值滤波法去除噪声。首先选取中值滤波器的窗口,因为指针和刻度处有尖角,所以选择适应于处理有尖角特征图像的十字形滤波窗口。滤波器的窗口的最小尺寸不能小于图像中最小物体的尺寸,所以在选择时先根据表盘中刻度大小选择较小的窗口,然后增大窗口,直到达到满意的滤波效果。滤波的过程是将窗口按照从左往右,从上往下的顺序进行排列,求取这些像素点的中值作为中心点的新的灰度值。当移动到一个新的像素点位置时将相邻的点的灰度值按从大到小的顺序进行排列,求出这些像素点的中心点作为新的灰度值。对图像中的每一个像素点都执行以上的步骤,最后重新赋予新的灰度值的图就构成了所需的滤波后的灰度图。
3.对比度拉伸:对比度拉伸也叫灰度拉伸,主要思想是提高图像处理时灰度级的动态范围,如果所采集到的图像的灰度集中在较暗区域导致图像偏暗,可以用灰度拉伸功能来拉伸物体灰度区间以改善图像;如果所采集到的图像集中在较亮的区域而导致图像偏亮,也可以用灰度拉伸功能来压缩物体灰度区间以改善图像。
4.二值化处理:为了图像处理更加方便,快捷,对图像进行二值化处理。首先需要确定一个二值化的阈值,然后把所有高于阈值的像素点设置为“1”,把低于阈值的像素点设置为“0”。这样图像就变成了只有两个量化值的黑白图像。阈值的确定采用最大类间方差法。其原理是设定一个灰度值,用设定的灰度值将图像的灰度值氛围两类,当两类的类间方差值达到最大时,此时的灰度值就是仪表图像二值化的最佳阈值。
实施本发明的过程中hough圆检测并获取单个仪表盘图像的过程如图4所示。
首先检测圆心,对采集到的图边缘进行检测,确定圆周线,在二维霍夫空间内绘出所有的法线,某个点上累加的值越大,则说明圆心的概率越大,设定一个阈值,当大于该阈值时则认定为圆心。阈值的大小可根据与预期结果的误差调整,直至圆心与实际表盘中心重合。然后检测圆半径:计算圆心到圆周线的距离,这距离就是圆心所对应的半径。设定两个阈值,一个定义为最大半径max_radius,为图像宽度和长度的最大值;另一个定义为最小半径min_radius,初始化为0。圆心到圆周线的距离应该都大于min_radius小于max_radius,最后设定一个阈值d,如果相同距离的数量大于该阈值d,则该距离即为所测圆心的半径。以上调用opencv中的houghcircles函数实现,阈值d的值并不固定,首先为阈值d设置一个初始值50,如果没有检测出半径,则减小阈值;如果检测出多条不同值的半径,则增大阈值,直到该阈值对应唯一准确的半径。
确定圆盘之后进行分割编号,将已经确定的各个表盘的圆心为中心,以该圆心对应的半径r乘以2再加上d为边长作出正方形,该正方形包含该圆心对应的表盘。d的大小在2-5cm之间,根据实际表盘间的间距调整。最后将得到的正方形区域标记为1,重复以上步骤,截取出所有的表盘按1、2、3……顺序标记,待后面的读数识别处理。
实施本发明过程中进行单个仪表盘读数处理的过程如附图5所示。
首先同时进行的有两个部分的检测,分别是刻度线检测和指针检测:
(1)刻度线检测:采用houghlinesp函数检测刻度线,并将处理过后的单个表盘图像中的刻度线转换成对该刻度线区域中像素点累加峰值计算。为了区分开刻度线和指针两种直线,在函数中设定一个阈值作为刻度线的像素最大值,因为在指针仪表中刻度线短于指针线,所以检测到的直线的像素和应小于等于该阈值,如果超过则不是刻度线。函数中阈值的大小并不唯一,首先设置初始值为10-30区间内,当检测出指针线时减小阈值,当连刻度线也没有检测出来时增大阈值,直到最佳阈值使结果只有刻度线。然后将每条刻度线都映射到上一步骤中检测到的圆周线上,并用θ表示该映射点和起始点之间的夹角,用s表示像素的灰度值和,即每一个刻度可用(θ,s)表示;
(2)指针检测:采用houghlinesp函数对指针进行检测,为了区分开刻度线和指针两种直线,也需要设置一个阈值,。因为在指针仪表中指针线长于刻度线,所以检测到的直线的像素和必须大于该阈值,如果没有超过该阈值,则不是指针线。该阈值大小与上一步(1)中阈值的大小相同。然后指针线也映射到圆周线上,设映射到的点与刻度初始点的夹角为θi。
然后进行圆弧转换,通过公式
因为光线水汽等环境因素可能造成刻度线的缺失,为了准确的读数,利用刻度线之间间距相等的原理补全缺失的刻度。首先通过公式
最后进行读数,为了提高读数的准确率,本发明不用角度读书法,而是对传统的比例读数进行了改进,采用分段读数。首先确定指针在x轴上的位置,然后根据指针的位置确定前一个刻度所代表的仪表上的读数l,设仪表的总量程为s,则每个间隔代表