指针仪表检测算法
算法的实现方法:
通过对仪表的观察决定算法采用传统的检测方法实现,对仪表特征的分析,发现仪表的指针特征较为明显,且仪表形状为圆形,故算法决定采用Hough直线检测方法检测指针的位置,采用Hough检测圆的方法实现对仪表的检测。
文章目录
一、 算法实现步骤
1.1 流程图说明:
1.1.1 标定表中刻度最大最小值:
目前对于刻度最大最小值的标定方式采用手动标定方式实现,标定表中最大最小值的目的是用于计算指针指向最大最小值之间的夹角,以此来计算仪表的读数。下图中绿色为手动标定最小值点,红色为最大值点。
1.1.2 划定仪表所在ROI区域:
仪表位置的定位方式目前采用四个点坐标绘制矩形区域。这一步骤的意义在于减少周围物体对仪表检测的干涉和减少在检测过程中的计算量,达到提升检测速率和检测精度的效果。
1.1.3 对ROI区域进行矫正:
未矫正图像对检测精度和检测效果都有很大的影响,故我们需要对图像进行矫正后再进行检测。
目前该算法中采用的矫正算法为,通过手动标定四个点画出一个正方形,然后将这四个点作为特征与,我们直接给出的一个正方形进行匹配,以此来求出矫正后的图形。由于在标定这四个点时我们无法找到合适的对应点,所以该算法矫正效果并不理想。下图为矫正标定图像,红色点为标定的点,图为矫正后图像。我们可以看到在矫正后图像的刻度依旧出于畸变的形态,且表盘矫正效果好时应为圆形,此处矫正后表盘也并非圆形。
1.1.4 指针检测:
对矫正后图像进行预处理,预处理处理步骤如下图所示
1.1.5 预处理说明
- 划分仪表所在圆形ROI区域:再次对仪表位置进行定位,增加检测精度和提升检测速率。
ROI区域如下图所示,由于矫正后仪表并非圆形,所以我们通过表盘的颜色来区分表盘所在位置,并通过轮廓描绘方式描绘出轮廓,再通过求最小包围圆的方式拟合出仪表所在圆。
- 灰度化:对图像进行灰度化。灰度化的作用为:将原图RGB(OpenCV通道表示为BGR)三通道转换为单通道,灰度化的过程就是将每个像素点的RGB值统一成一个值,进而达到简化运算的目的。
- 方图均衡化:直方图均衡化是图像处理领域中利用直方图对对比度进行调整的方法。该方法可以把原始图像的直方图变成均匀分布的形式,这样就增加了像素灰度值的动态范围,进而达到增强图像整体对比度的效果,提高图像质量。通过下图我们可以看到通过直方图均衡化后指针和刻度的特征更为明显。
- 图像取反:图像取反的目的主要是将图像中指针和刻度变成白色为接下来的指针检测做准备。取反操作的结果如下图所示
- 中值滤波:中值滤波的目的主要是为了去除图像中文字和一些刻度对检测的干扰,滤波后示意图如下图所示。
- 腐蚀:腐蚀操作可以理解为将图像黑色部分放大,进而达到去除白色点的作用,我们利用腐蚀操作的这一特性来消除刻度和表盘中的文字对指针检测造成的干扰。腐蚀后图像如下图所示。
- 开运算:开运算=先腐蚀后膨胀,开运算可以用于消除一些孤立的小点,毛刺和小桥。可进一步对图像效果进行优化。开运算后图像如下图所示。
- 二值化:二值化的作用就是将整个图像变成黑白效果,只存在黑白两种颜色。
二值化后图像如下图所示。
- 细化操作:由于Hough检测直线时需要先将图像先进行边缘检测,边缘检测结果如图14-1所示,我们可以看到在图14-1中如果直接对指针进行直线检测,检测到的直线为指针的边缘而非指针的中心,且由于我们计算刻度的方式指针所在直线进行判定,故采用边缘检测后直接对指针进行检测存在很大的误差。
针对指针的检测方法,我查阅了许多的论文,最终在进行Hough检测前旋转采用细化的方法而非边缘的方法。关于细化算法,后面单独一章说明。
10. Hough直线检测(检测指针):
Hough检测是一种利用图像的全局特征将特定形状的边缘连接起来,形成一个连续平滑边缘的一种方法。它通过将源图像上的点影射到用于累加的参数空间,实现对已知解析式的直线或曲线的识别。
Hough指针检测效果如下图所示:
1.1.5. 求指针旋转中心
求旋转中心的方式:
一、第一种方式:起初想到的是通过检测表盘的圆进而得到圆心,由于指针所在旋转中心与表盘中心是同一个中心,故表盘的圆心就是指针的旋转中心。但该方式有一个必要条件就是表盘的圆可以准确检测出来,而由于表盘畸变严重,表盘所在的圆无法通过Hough变换检测出,且表盘中心也无法准确求出。
二、第二种方式:通过三个点拟合圆,三个点拟合圆的方法存在几个问题:
- 由于刻度无法检测出,所以我们需要标定三个点,而既然已经标注三个点那为何不能够直接将指针旋转中心标定呢?
- 三个点拟合出来的圆并不准确,存在的一定程度的圆心偏差,会导致在后续的运算中的误差。
介于这两个问题,选择放弃第二种方式。
三、第三种方式:通过刻度最小值和最大值的中垂线和指针求指针的旋转中心。由于表盘是圆,故我们可以得到刻度值也都在一个圆上,而刻度的最大值和刻度的最小值都在这个圆上,故其中垂线必定经过圆心,且刻度所在圆的圆心与指针旋转中心为为同一个中心。此时我们只需要求出指针与中垂线的交点便可以得到指针所在的旋转中心坐标。原理如图16所示,Line1为刻度最大最小值连线,Line2为Line1的中垂线,Line3为指针。计算公式如下所示。
Line3斜率:
k3 = (Line3.y2 -Line3.y1) / (Line3.x2 - Line3.x1)
Line2斜率:
K2 = (Line2.y2 - Line2.y1) / (Line2x2 - Line2.x1)
Line1斜率:
K1 = (Line1.y2 - Line1.y1) / (Line1.x2 - Line1.x1)
交点坐标为:
X0 = (Line1.x2 + Line1.x1) / 2
Y0 = (Line1.y2 - Line1.y1) / 2
联立中垂线与指针的直线方程求交点坐标(X,Y)
X = (k2X0 - k3Line3.y2 - Y0 + line3.x2) / k2 - k3
Y = k3 * (x - line3.x2) + line3.y1
该这一种运算方式当求斜率的分子或分母为零时会无法求出直线斜率,进而导致圆心求不出。故我们需要对分子或分母为零的情况做判断,当分子或分母为0时,中垂线的方程为X=(Line.X2+Line2.x1) / 2或Y =(Line.Y2+Line.Y1)/2,然后将中垂线方程与指针直线方程联立得到圆心坐标。
1.1.6 通过旋转中心求最大最小刻度的夹角
a,b,c三条边长可通过三个点坐标求出,
Cosα = (c2+b2-a^2)/2bc
α为三个点组成三角形的内角,且由于该角度求出为三角形的内角,而刻度最大最小值的夹角为三角形的外角,所以
刻度最大最小值的夹角 = 360 - α
1.1.7 通过旋转中心、刻度最小值、Hough检测直线得到的指针的点求0刻度到指针刻度的夹角
夹角的求法与求最大最小值刻度夹角方法一致,但此处要对指针所在的点坐标位置进行判断,采用向量法判断点所在直线位置的方式进行判断。
Point1为0刻度点,Center为指针旋转中心点,Point2为指针所在直线的点。
Line1_x = Point1.x - Center.x Line1_y = Point1.y - Center.y
Line2_x = Point2.x - Center.x Line2_y = Point2.y - Center.y
D = Line1_xLine2_y - Line2_x Line1_y
当D<0时指针指向为刻度右下方,当D>0时指针指向左上方,D=0时点在线上。
当指针指向超180度是COS算出的角度为锐角故我们需要对超出180度的角度进行判断,而超过180度的点都在刻度的右下方,故在右下方的点角度都需加上180度。
1.2 细化算法
经典的细化算法有:Hilditch算法、Deutch细化算法、Pavlidis细化算法、Zhang快速并行算法。
1.Hildich算法:该算法是一种串行处理方法的一种,最终得到的是8条近邻连接线条。其主要原理是每次扫描并删除图像上满足一定的条件的轮廓像素,直到图像上不存在可删除的轮廓像素为止。由于该算法在判断一像素是否是边缘点是否应该被删除时,判断依据太多,有些条件不够简洁,有效,判断条件之间有重复,这样造成处理速度慢、通用性差。
2.Deutch细化算法:Deutch细化算法采用的处理方式为并行处理方式,其算法也是采用两层子循环。在开始的子循环中,目标像素P删除的条件是:
- ∑Pk= 0(0≤k≤7);
- Nc=1;
- P0+P2+P4+P6≤3;若条件满足,则该点P标记为可删除像素。在接下来的子循环中,扫描整幅图像,将所有这样的像素删除。该算法得到的骨架为不完全的8-连接,可以看作是具有可删除点的8-连接图形。
该算法经过测试发现存在当指针二值化过度或腐蚀过度时,存在丢失关键的特征点的问题。
3.Pavlidis细化算法:Pavlidis细化算法也是并行算法的一种,它通过与两个模板进行匹配逐层剥掉边界像素,所得到的骨架形态是 8- 连接的。Pavlidis异步细化算法是通过并行和串行算法混合处理来实现细化。采用比特运算进行特定模式的匹配,所得到的骨架形态是8- 连接的。
该算法与Hilditch算法类似,在考虑每个点周围8个相邻点的同时,考虑这些 点各自周围点的情况,并根据点点之间关联关系对Hilditch算法的删除 条件进行了一些限定,从而能充分考虑图像上的像素信息,在删除点的 时候,可以根据新的判断条件高效地去除图像上多余的像素,而不丢失关键的特征点。
4.Zhang快速并行算法:Zhang快速算法所代表的基于数学形态学的细化方法是利用彼此相互独立并列的结构元素进行二值图象的细化,因此更易于实现且计算简单。但同时,我们也应该看到 Zhang快速算法存在细化宽度不能保证为单像素宽的缺陷,原图像会有很多毛刺,这对于以后的查找细化图像的分差点带来了很大的困难。
综上所述,我们的细化算法选择采用Pavlidis细化算法,该算法可以满足我们对图像处理速度和对细节检测的要求,相对其他几个算法而言较为适合我们的检测。
二、刻度检测算法
刻度检测算法目前已尝试方案:
- 通过轮廓方法抓取出刻度,并对刻度进行检测,该方式由于,图像中的文字和水纹对刻度有一定干扰,无法成功提取除刻度轮廓,无法成功检测刻度。
- 拟合刻度所在的圆,然后通过刻度直接的间隙来拟合出刻度所在位置,该方式需要成功检测到两个相邻刻度,且图像不能存在畸变,该方式并不可行。
刻度检测过程如下图所示:
2.1算法说明
2.1.1 高斯滤波
高斯滤波的作用主要是过滤一些图像中的噪点效果如下图所示
2.1.2 黑帽处理
黑帽运算(img) = 闭运算图像(img) - 原始图像(img)
经过闭运算操作的图像与原图像的差值图像,作用是突出原图像中比周围暗的区域。(比如闭运算本身可以填补物体内部的一些黑洞,这些黑洞就可以通过黑帽运算来凸显)。
我们可以通过黑帽操作来去掉图像中的指针和部分文字对我们刻度检测的干扰。黑帽处理后图像如下图所示。
2.1.3 自适应二值化
自适应阈值可以看成一种局部性的阈值,通过规定一个区域大小,比较处理像素点与区域大小里面像素点的平均值—阈值(或者其他特征)的大小关系确定这个像素点是属于黑或者白(如果是二值情况)。其目的就是将图像转换为只有黑白的二值化图像,处理结果如下图所示。我们可看到二值化过后图像中依旧有许多干扰,而这些干扰与刻度极为相似,无法通过处理方式将其过滤掉,因此我们采取描绘轮廓检测的方式尝试过滤的方式处理。
2.1.4 轮廓检测
该方式也为通过连通域的方式描绘轮廓点,其目的与边缘检测的方式相似。我们在描绘出轮廓后,由于二值化处理的效果并不理想,因此我们分析,刻度的形状基本为一个长方形,那些干扰则为一些不规则图形。所以我们能否通过刻度的面积和刻度的长度对图像中的刻度和干扰进行区分?想到这便开始尝试,过滤过后的图像效过也并不理想,过滤无法将刻度之外的点全部过滤掉,依旧存在许多干扰,结果如下图所示,图中绿色的点为过滤后轮廓。
2.2 总结
由于图像干扰过多,我们图像处理并不能做到在对图像进行处理时将其他噪点全部过滤掉而只保留刻度的情况,故此方法并不可行,因此我们决定尝试新的解决方案,通过深度学习标定刻度最小值和刻度最大值两个点,并通过角度法计算仪表刻度。
三、算法测试情况
图23-1为夜间检测结果,我们可以看到在检测时存在一定的误差,此处误差为图像畸变与零刻度标定时存在的误差。
图23-1为白天检测结果,我们可以看到在检测时存在一定的误差,此处误差与图像畸变和零刻度标定时存在的误差有关。
由于图24-1检测为p的图,故可能存在P出来的效果与实际指针指向存在一定误差,。且仪表本身畸变也会造成一定的误差,而且在图像处理过程中也会造成一些细微的误差。
图25-1为指针指向小于三十度刻度的结果,该图也为ps图,故在指向上可能会存在一定误差,且该位置存在水纹干扰,也会造成一定的误差。
本文源码:指针仪表检测算法源码分享