点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
一、引言
我国是一个水灾频发的国家,水安全问题已成为影响经济和社会发展中的重要因素之一。洪水等突发事故所引发的损失和危害巨大,因此水情监控问题成为国家水利部门关注的重点。为了准确而实时地监测水位,目前国内多数水文监测站使用的是传统水位测量方式。
传统水位测量方式主要有安装水尺目测读数和使用传感器自动采集水位相关的模拟量再转换为水位量两种。其中,目测读数的方式需要耗费人力,且实时性不高,恶劣环境下读取水位人员的安全也不能保证。使用传感器自动采集则主要有超声波式、压力式、浮子机械编码式、雷达式等测量手段。这些测量方式优点与缺点并存,缺点也非常显著,如难于维护,受环境影响较大等。
本文通过设计一系列图像识别算法,对从视频流中截取的水尺图像进行处理,经过灰度化、中值滤波、边缘检测、二值化、形态学处理以及图像细化,最终由算法得出水位数据。整个测量过程主要由摄像机和识别软件完成,精度较高且应用要求低,因此具有广阔的应用前景。
NO
二、目标图像的提取和预处理
⒈目标图像的截取和平均
从摄像机采集到的视频图像数据,首先要选取出数帧含有水尺图像的图片进行平均。利用微软的MSDN提供的视频处理函数与OpenCV提供的截取视频帧函数可以从摄像机采集的视频中提取出若干帧的图像并保存。截取连续的数帧图像取平均可避免非常态干扰,提升测量精度。
⒉彩色图像的灰度化
由于很多摄像机支持彩色图像拍摄,在处理图像之前,应对采集到的彩色图像按照式⑴进行灰度转换以便后续处理。
T=0.299×R+0.587×G+0.114×B ⑴
其中T得到转换后目标图像的灰度值,R、D、B分别为红、绿、蓝的彩色图像分量,图1为灰度化后的图像。
图1 灰度化后含有水尺的图像
NO
三、兴趣区域的提取和形态学处理
⒈中值滤波
灰度化后的图像可能存在有由于环境或干扰产生的噪声,如热噪声、量化噪声等,首先需要对其进行滤波去噪。这里采用能够较好保留图像细节的中值滤波方法。
中值滤波作为一种非线性技术,可以有效的消除孤立噪声点同时保持图像中的关键细节,它将每一像素的灰度值按照该像素周围一定区域内所有像素点灰度的中值重新设定,从而消除与区域内像素灰度中值差异过大的点。
中值滤波的主要算法流程如下:
⑴设置一个合适大小,含有奇数个点的采样窗口。
⑵通过采样窗口在被处理的图像中取出奇数个像素,并对这些像素的灰度值进行排序。
⑶选取奇数个灰度值的中值,即从小到大排在中间的一个,作为替换值。
⑷将在采样窗口中心位置的像素的灰度值,设为替换值。
⑸重复步骤⑵-⑷,对图像中所有像素点进行处理。
一般情况下中值滤波后,小于采样窗口面积的一般噪声点可以滤除,而较大的物体如水尺刻度,水面轮廓等几乎完全不受滤波的影响。
⒉边缘检测
对经过滤波后的图像采用边缘检测,可以很好的提取到水尺刻度的特征,大幅度减少数据量并剔除不需要的图像信息,同时还能保留重要的图像结构属性,便于后续处理识别。边缘检测中常用的算子有Canny算子,或各种改进的Canny算子以及Sobel算子。这里由于是对水尺刻度的识别,对细节纹理不太注重,所以选择了虽然不如Canny算子准确但效率更高的Sobel算子。
Sobel算子算法的优点是计算简单、速度快,通常检测时带有方向性。可以选择进行水平方向检测或者垂直方向检测,或两个方向都检测。因为水尺刻度在图像中处于水平方向,这里进行垂直方向的边缘检测。图2所示为中值滤波和边缘检测后的图像。
图2 滤波和边缘检测后的图像
⒊二值化
对图像进行边缘检测后再通过二值化,去除水面、背景等非目标图像。一般从多值的图像中提取目标物体,最常用的方法就是设定出全局的阈值T,然后根据全局阈值,将图像的数据分为两部分:灰度值大于T的部分和灰度值小于T的部分。将灰度值大于T的部分的像素设为白色(或黑色),而灰度值小于T的部分设为黑色(或白色)。本文使用迭代阈值法合理选取全局阈值进行二值化,迭代阈值法的算法流程如下。
⑴设置一个初始阈值T0,可以自己设置或随机生成。
⑵根据初始阈值将图像分割成两部分,目标图像区域S1和背景图像区域S2。
⑶分别求出S1和S2部分的像素灰度平均值G2和G2。
⑷设定新的阈值Tn为(G2+G2)/2。
⑸重复步骤⑵-⑷,不断用新设定的阈值分割图像,计算平均灰度值,直到得出的新阈值等于上一次的阈值。
经过二值化后的图像如图3所示。
图3 二值化后的图像
⒋形态学处理
二值化后的图像,还可能存在一些干扰判断的噪点,有必要通过形态学的腐蚀处理来进一步滤除。膨胀和腐蚀是形态学的基础运算,许多形态学算法都以它们为基础。其中腐蚀的作用是去除小于结构元素的物体,对图像的腐蚀过程如下。
⑴用结构元素Y扫描待腐蚀二值图像X的每个像素。
⑵结构元素Y的像素与其覆盖的二值图像区域做“与”操作,即如果全为1,则结果图像的该像素为1,否则为0。
腐蚀后的刻度图像如图4所示。
图4 腐蚀后的刻度图像
⒌图像细化
去除背景和水面经过腐蚀后得出的水平刻度线,不宜直接用于后面的处理分析,需要对上一步的结果图像进行图像细化处理。图像细化可以从目标图像中提取出图像骨架,即将将原图像中像素宽度大于1的线条细化成只有1像素宽的线条,之后可以比较容易的分析图像或提取图像的特征。此处使用Zhang快速并行细化算法对刻度进行细化,细化后的图像如图5所示。
图5 细化刻度后的图像
NO
四、基于K-means聚类分析的水位识别
⒈K-means聚类分析获取刻度数
数据聚类是对于静态数据分析的一门技术,在许多领域内都被广泛地应用,包括机器学习、数据挖掘、模式识别、图像分析、信息检索以及生物信息等。K-means算法是最常用的聚类分析方法之一,是由Macoueen提出,它具有算法简单且收敛速度快的特点。通常采用的准则函数是平方误差准则函数,即:
⑵
式中,E为所有数据的误差平方和,P为单个的对象,mi为均值。K-means算法是基于距离的聚类算法,它将相聚越近的对象判定为相似度越大,认为簇是由紧凑的距离靠近的对象形成的,因此最终可以得到紧凑且独立的簇。
K-means算法的流程如下:
⑴从N个对象中随机选取K个对象作为聚类质心。
⑵对剩余的每个对象,算出它们到每个质心的距离并归类到相聚最近的质心的类。
⑶重新计算已经得到的各个聚类的质心。
⑷重复步骤⑵-⑶,不断划分新的聚类并得出新的质心,直到新的质心与上一次计算得到的质心相等或者小于指定的阈值,此时得到的聚类即为最终结果。
对于上一步图像细化后的刻度图像,每一条刻度将被划分为一个聚类,从而最终聚类数量等于可以识别出的刻度数量,进而在后续处理中算出水位。
⒉水位测量算法
⑴算法思想
对从视频流中截取平均,经过灰度化、中值滤波、边缘检测、二值化、腐蚀、刻度细化后的图像,通过聚类分析的方法,先随机选取若干对象作为聚类质心,设定阈值位水尺相邻刻度间的最小距离,聚类分析后算出满足条件的聚类数量N,再根据水尺和公式计算水位。
⑵总体算法
从视频流中截取数帧图像取平均,并灰度化。
①对⑴获得的图像进行中值滤波,使用Sobel算子边缘检测。
②将上一步得到的图像二值化后进行腐蚀处理。
③对腐蚀后的结果图像进行图像细化处理。
④随机选取图像中的像素作为初始聚类中心,设置合理的阈值后进行聚类分析,得出水尺刻度线间隔数N。
⑤根据公式代入间隔数N计算水位。
⑶实验结果分析
实验数据库采用240张在现场用摄像机拍摄得到的图片,包括一天中不同时间的不同水位信息,在此基础上进行水位识别,算法处理每张图像所需时间在65~80ms之间,设定误差允许范围在1cm以内的情况下,所有图像都得出正确检测结果。
下面给出实验图像由算法得出的数据结果和由人眼目视读取的水位结果以及两种水位间的误差进行比较,图6所示为人工测量得到的水位,图7所示为识别算法得出的水位,图8所示为算法程序得到水位与人工得到水位之差。
图6 人工测量得到的水位
图7 识别算法得出的水位
图8 算法得到水位与人工得到水位之差
从图8可以看出误差不超过0.6m,造成误差的主要原因有实际拍摄水位时,水位线不是完全静止,会有小范围的浮动;以及部分水尺的刻度线模糊缺损,导致边缘检测算法难以刻度线。总体来说,提出的算法的识别正确率和实时性能够满足应用需求。
五、结论
五、结论
本文提出的水尺测量算法基于图像识别,可广泛应用于测量各种可使用水尺的水位测量场合,费用低廉、设施简单、并且精度较高。水位识别方法通过灰度变换,边缘检测,图像细化,K-means分析等得到刻度线然后计算水位,由于视频摄像的实时性,可方便的对水位进行远程在线监控,具有较强的实用性。对于原本已经架设摄像头的系统,无需添加太多设施即可完成改造。
好消息!
小白学视觉知识星球
开始面向外开放啦👇👇👇
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~