【时钟识别】Hough变换指针式时钟识别【含GUI Matlab源码 2085期】

⛄一、简介

1 仪表示数识别流程
基于刻度准确定位的指针式仪表示数识别方法包括预处理、指针检测、刻度定位、油位计表盘中心拟合与仪表读数计算5个部分。该方法无需预先添加任何表盘信息,算法流程如图2所示。整个流程分为两步且同时进行——第1步,将油位计图像进行灰度化和边缘检测等预处理,再通过指针检测获得油位计的指针信息,其中指针检测又包括概率霍夫变换检测和指针位置的计算;第2步,将原图进行灰度化、二值化和膨胀腐蚀等预处理,再经过刻度定位(刻度定位包括粗识别和细识别),使得预处理后的图像先经过粗识别粗略定位出所有可能包含油位计刻度的区域,再单独截取出粗识别的结果并进行细识别,定位出刻度,获得计算所需要的圆心信息和刻度信息,最终结合这两步计算出读数。
【时钟识别】Hough变换指针式时钟识别【含GUI Matlab源码 2085期】_第1张图片
图2 文中算法流程

2 预处理
在用无人巡检机拍摄油位计图片时,由于表盘自身信息干扰或光照变化等因素的影响,无法准确提取出有用的仪表信息,从而会影响仪表读数的计算。因此,在提取指针区域之前必须对图像进行预处理以去除部分噪声,为后续指针识别和刻度定位信息的精确提取提供清晰的图像,以获得精度更高的指针式仪表读数。

2.1 二值化
指针式仪表通常暴露在室外,再加上工业生产中的光线变化及油位计自身表框或周围仪器的遮挡产生的阴影,巡检机器人采集到的图像很可能是部分阴影、部分光亮的表盘图片。为了后续精确定位刻度和提高计算效率,需要对彩色的油位计图像进行二值化处理,去除对提取表针有干涉影响的背景。图像的二值化处理就是把图像中的像素按照给定的阈值分化成黑白两种颜色。

2.2 膨胀腐蚀
为消除表盘噪声点和非实心区域,同时尽量避免对表盘内部的实心刻度与指针信息造成影响,文中采用形态学处理中的膨胀和腐蚀操作对二值化表盘图像进行预处理,具体步骤如下:首先对二值化图像的白像素进行膨胀,消除孤立噪声点和非黑的实心图像区域;然后对膨胀后的图像进行腐蚀,将被压缩的黑色部分近似恢复到原来的大小,还原表盘有效信息。

2.3 边缘检测
为了后续表盘指针的精确识别,需先将表盘图像转化为灰度图后再进行边缘检测。目前较为主流的边缘检测算子主要有Canny算子、Laplace算子、Roberts算子、Sobel算子等。而在所有的边缘检测算法中,Canny边缘检测不但定义严格,还具有实现过程简单、检测可靠性高等优点,因此文中选择Canny检测算法来进行油位计图像的边缘检测,结果如图5所示。

3 指针检测与刻度定位
通常指针直线检测都是采用霍夫变换进行的,然后直接选择矩形刻度的几何中心来计算表盘读数。在拍摄角度倾斜过大的情况下,矩形宽刻度将会被部分遮挡,使得刻度大小不一,且直接选择矩形刻度的几何中心计算刻度时会产生较大的误差,所以文中先用矩形刻度的几何中心拟合出一个粗略的圆心,然后选择每个刻度距粗略圆心较近的两个角点的中点来计算油位计读数,同时对该粗略圆心进行修正。

3.1 指针检测
霍夫变换一直是直线检测中比较流行的方法,其通过两个坐标空间之间的变换,将图像中直线上的所有点都在变换空间的某个点上形成峰值。但是传统的霍夫变换无法检测出油位计指针的方向。文中采用累计概率霍夫变换(Progressive Probabilistic Hough Transform,PPHT来提取指针。累计概率霍夫变换算法是标准霍夫变换算法的一个改进,它在一定的范围内进行霍夫变换,算出独立线段的范围和方向,可以实质性地减少计算时间,运行效率很高。由于油位表的指针较粗,将检测出两条线段,并且累计概率霍夫变换检测出的结果是一条直线上的两个点,这两条直线的交点即为指针针尖,指针的指向即为从圆心到针尖的方向。文中采取斜率为这两条直线斜率的平均值且穿过针尖的直线作为该油位计指针。累计概率霍夫变换检测是在油位计边缘检测的图上进行的,但是为了更显著地显示出累计概率霍夫变换的结果,文中将检测结果显示在原仪表图上,如图6所示。图6中共有4个点,这4个点即为指针累计概率霍夫变换检测的两侧直线的结果,图中所示的直线是穿过指针两侧直线交点且斜率为指针两侧直线斜率的平均值的直线,可认为这条直线是油位计指针所在的直线。

3.2 刻度粗识别与精准定位
在识别倾斜角过大情况下获得的油位计读数时,由于表盘内部信息(数字、符号、仪表编号、生产厂商等)的干扰,且矩形刻度并非水平,自身的旋转角度各不相同,使用传统方法在整个油位计表盘的图像中直接定位出油位计刻度位置较为困难。为此,文中提出一个先粗识别再精确识别并定位出刻度的方法,在识别倾斜角过大情况下获得的油位计示数时,也能准确地定位出油位计刻度的位置,并提取出刻度中更有利于抗角度干扰的后续计算读数所需的信息。

首先对油位计刻度进行粗识别,在膨胀腐蚀结果中寻找各个闭合形状的边缘点集,判断各个闭合区域的大小,设定最大阈值和最小阈值,将面积不属于该阈值范围内的区域过滤掉,然后求出该区域的最小外接矩形,将最小外接矩形的中心坐标保存在一个列表中。粗识别的结果如图7所示。此时保留的中心坐标包括了刻度外接矩形的中心坐标和一些干扰信息的中心坐标。为了去除这些干扰信息,以粗识别获得的最小外接矩形中心继续作为中心,略微扩大矩形框的长与宽,在对应表盘原图中截取如图8(a)所示的图片。对截取的图片使用Harris角点检测方法进行矩形检测,排除掉角点过多和角点无法形成矩形的图,得到真正的刻度。Harris角点检测结果如图8(b)所示。所得矩形刻度4个角点中,距离圆心较近的两个角点所对应线段的中点用于后续油位计读数的计算。

3.3 油位计表盘中心的拟合
在精确定位刻度之后,先用所有矩形刻度的几何中心拟合出一个粗略的圆心,获取每个矩形刻度的4个角点与该圆心的距离,距圆心最短的两个角点的连线中点构成一组坐标点。这组坐标有一个共同点,即该组坐标全部近似位于一个椭圆上,满足以下关系:

x2+Axy+By2+Cx+Dy+E=0 (1)

式中,A、B、C、D、E为椭圆的未知参数。通过最小二乘法对该组坐标进行拟合,得到目标椭圆,因此可设置目标函数F如下
【时钟识别】Hough变换指针式时钟识别【含GUI Matlab源码 2085期】_第2张图片
在拍摄倾角过大时,拟合得到的椭圆圆心与指针并不在一条直线上,若将其直接用于计算读数,获取的油位计读数误差会较大。因此,选择圆心(xc,yc)距累计概率霍夫检测得到的指针直线方程上最近的一点作为真正用于计算的圆心(xt,yt)。

4 读数计算
传统方法[19]计算指针式仪表的读数时,一般通过Hough变换直线检测来获取正面圆盘图像的指针角度信息,在获得直线的角度后,即可计算出读数。假设:直线的角度为θ;最小刻度为kmin,对应的角度为θmin;最大刻度为kmax,对应的角度为θmax;读数用k表示。那么,k可由以下公式计算:

k=(kmax−kmin)×θ−θminθmax−θmin         (5)

但是,在拍摄角度倾斜较大的情况下,每两个相邻的刻度与圆心组成的夹角不是一个完全相等的值,也就是说,采集图像中的指针与刻度线的角度差有的偏小有的偏大。这将导致指针相对于每个刻度线的读数出现误差。对于传统方法,可以使用透视变换来对油位计的图片先进行校正。透视变换是将图片投影到一个新的视平面,拥有较高的灵活性。结合油位计的先验信息(起始刻度倾角与末位刻度倾角),即可用传统的方法计算出油位计的读数。但该方法需要预先选取4个点,而油位计表盘没有合适的参考点,因此需要手动选出4个点来校正表盘。而文中提出的油位计示数识别方法,无需对表盘进行校正也能准确地计算出读数。

文中读数计算方法的步骤如下:
步骤1 计算所有矩形刻度精确定位后所得坐标点与相邻两个坐标点的距离并求和;
步骤2 根据油位计表盘信息可得:距离和最大的两个点为0与10,且巡检机器人拍得的图片中0的纵坐标大于10的纵坐标,即可求得0与10坐标;
步骤3 接着计算与0距离最近的点,即为1,依次可将所有坐标点对应的数字一一求出;
步骤4 计算所有坐标点与指针针尖的距离,距离针尖最近的两个坐标点记为k1与k2(k1+1=k2);
步骤5 使用式(6)计算表盘读数k:
【时钟识别】Hough变换指针式时钟识别【含GUI Matlab源码 2085期】_第3张图片

⛄二、部分源代码

function varargout = mytime(varargin)
% MYTIME MATLAB code for mytime.fig
% MYTIME, by itself, creates a new MYTIME or raises the existing
% singleton*.
%
% H = MYTIME returns the handle to a new MYTIME or the handle to
% the existing singleton*.
%
% MYTIME(‘CALLBACK’,hObject,eventData,handles,…) calls the local
% function named CALLBACK in MYTIME.M with the given input arguments.
%
% MYTIME(‘Property’,‘Value’,…) creates a new MYTIME or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before mytime_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to mytime_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE’s Tools menu. Choose “GUI allows only one
% instance to run (singleton)”.
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help mytime

% Last Modified by GUIDE v2.5 03-Sep-2022 08:44:17

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @mytime_OpeningFcn, …
‘gui_OutputFcn’, @mytime_OutputFcn, …
‘gui_LayoutFcn’, [] , …
‘gui_Callback’, []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT

% — Executes just before mytime is made visible.
function mytime_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to mytime (see VARARGIN)

% Choose default command line output for mytime
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);
% set(gcf,‘Name’,‘时钟识别’);
set(gcf,‘numbertitle’,‘off’,‘name’,‘时钟识别’);

% UIWAIT makes mytime wait for user response (see UIRESUME)
% uiwait(handles.figure1);

% — Outputs from this function are returned to the command line.
function varargout = mytime_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

% — Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%%[filename,pathname]=uigetfile({‘.jpg’;'.bmp’;‘*.gif’},‘选择图片’);
%%if isequal(filename,0)
% disp(‘Users Selected Canceled’);
%else
%str=[pathname filename];
%im = imread(str);
%axes(handles.axes1);%axes1是坐标轴的标示
%imshow(im);
%end;
global im
global flag ;
flag = 1;
axes(handles.axes1);
im=imread(‘时钟-1.jpg’);
imshow(im);

% — Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global im
global flag ;
flag = 2;
axes(handles.axes1);
im=imread(‘时钟-2.jpg’);
imshow(im);

% — Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global im
global flag ;
flag = 0;
if(flag == 0)
flag = 3;
end
axes(handles.axes1);
im=imread(‘时钟-3.jpg’);
imshow(im);

function popupmenu2_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,‘String’)) returns popupmenu2 contents as cell array
% contents{get(hObject,‘Value’)} returns selected item from popupmenu2
global im
global BW
global BW1
global angle_m
global angle_h
BW = imresize(im,0.7); % initial picture 70%

[m,n]=size(BW); %图像去除背景
for i=1:m
for j=1:n
if BW(i,j)>100
BW(i,j)=256;
end
end
end
BW = im2bw(BW);%rgb转化为二值化图像
BW = imcomplement(BW); %图像反色
val = get(handles.popupmenu2,‘value’);
%选择骨架次数
switch val
case ‘1’
t=3;
case ‘2’
t=4;
case ‘3’
t=5;
case ‘4’
t=6;
case ‘5’
t=7;
case ‘6’
t=8;
otherwise
t=9;
end

⛄三、运行结果

【时钟识别】Hough变换指针式时钟识别【含GUI Matlab源码 2085期】_第4张图片
【时钟识别】Hough变换指针式时钟识别【含GUI Matlab源码 2085期】_第5张图片
【时钟识别】Hough变换指针式时钟识别【含GUI Matlab源码 2085期】_第6张图片

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 向友君,江文,阮荣钜.基于刻度准确定位的指针式仪表示数识别方法[J].华南理工大学学报(自然科学版). 2020,48(10)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

你可能感兴趣的:(Matlab图像处理(进阶版),matlab,计算机视觉,图像处理)