周科成 刘资 刘旭 代淇源
摘 要:管道作为输送石油和天然气最为安全有效的方式,其质量优劣直接关系到油气输送的安全性,因此,对管道故障的有效提取检测至关重要。在故障的图像处理工作中,选择合适的处理阈值十分重要。本文基于OpenCV计算机视觉库,改进传统图像处理算法,提供一套可以根据检测环境中光强条件自适应选取最佳检测阈值范围的算法。实验结果表明,该方法在管道检测领域中可以准确地选取一定光照强度下的最佳检测阈值,为后续的处理过程提供了便利。
关键词:油气输送;管道故障;自适应算法;最佳阈值范围
中图分类号:TP391.41 文献标识码:A 文章编号:1671-2064(2018)23-0013-04
1 引言
随着国家能源工程的大力开展,作为最有效、安全的输送方式,管道运输一直备受青睐,而管道的安全运营是决定能源工程能发挥持续作用的基础保障。
针对预备役管道的常见缺陷,国内外学者已经研发了诸多检测方法来排除运营风险。在国内,韩文花等人引入小波系数去噪算法,用于去除管道检测漏磁信号中系统噪声[1];廖高华、甘志梅等人总结了以CCD摄像头采集信息的焊缝检测视觉图像处理的方法[2];林兰极,王库等提出了一种基于DSP的石油管道焊缝检测算法[3]。国际上,ANATOLY D,SERGEY K等研究了磁记忆方法对于管道缺陷线上检测的应用[4];美国通用电气公司(GE)应用的具有腐蚀检测模式的超声波相空阵管道内检测器,检测精确度可达90%[5]。
然而,管道内部空间狭小、光照不足及噪声种类繁多等不利因素都为检测阈值的选取带来了困难。针对此现象,本文在前人研究基础上提出一种可以根据检测环境中的光照强度自适应选取最佳阈值的算法。
2 图像处理平台——OpenCV簡介
2.1 OpenCV的基本特点
OpenCV实际是经开发而得到的C源码,全部的算法均以封装在IPL的动态数据结构为基础,拥有高灵活性。其以Intel处理器指令集为基础,超过50%的函数在进行汇编或设计时,均能以Intel处理器指令集为对象,不断优化代码并提高代码运行速度;OpenCV不仅有统一的功能定义与结构,而且还有便捷且灵活的接口,包含C/C++函数达300多个,其强大的矩阵计算能力帮助技术人员大幅减少开发时间与精力投入,不仅对程序开发质量与效率有提升作用,还能提高整个程序运行的稳定性与可靠性;除此之外,OpenCV可以兼容多种操作系统,包括MacOS、Linux、Windows等。同时支持大多C/C++编译器,保证了代码可以在多种平台间无障碍移植,诸如C++Builder、VC.NET2005、Visual Studio及VC++6.0等。[6]
2.2 与本文算法相关的OpenCV库函数简介
由于本算法基于OpenCV实现,所以在此将与本算法相关的OpenCV库函数做简单介绍,方便读者在复现算法的同时也可以根据实际需求灵活地进行修改。
(1)Mat():
Mat是OpenCV中最基本的库函数,属于core模块。严格意义上讲Mat属于“类”概念,由两个数据部分组成:矩阵头和一个指向存储所有像素值的矩阵的指针。用于创建一个矩阵类型,开辟内存空间来存放指定图像。
函数原型:cv::Mat::Mat(int rows, int cols, int type, const Scalar &s;)
rows:预先指定图像的行数;cols:预先指定图像的列数;
type:图像矩阵中每个元素在内存中的存储类型;
Scalar:OpenCV中的数据类,常用来定义每个通道中的值。
(下文中起相同作用的输入变量不再做详细介绍)
(2)at动态地址:
at()函数隶属于Mat类。给使用者一个非常方便的接口以访问图像中的每个像素。可用于遍历单通道以及多通道图像。用法如下:
at
type:该图像的类型,包括灰度、GRB等;
channel:图像的通道数。
除此之外还用几种常见的图像遍历方法,比如迭代法、查找表法以及利用LUT函数等方法。在此就不一一赘述了。
(3)threshold():
threshold()函数是OpenCV所提供的一种用于执行基本阈值操作的库函数,属于imgproc模块。应用此函数可以进行多种阈值操作包括二进制阈值化、反二进制阈值化、截断阈值化等。具体用法如下:
double threshold(Mat InputArray,Mat OutputArray, double threshold,double maxval,int threshold_type);
Mat InputArray:输入图像;Mat OutputArray:输出图像;
double threshold:使用者指定的操作阈值;
double maxval:进行二值化操作时的最大阈值(最小阈值默认为0);
int threshold_type:使用者可选定要进行的阈值操作。
(4)Canny():
Canny()是OpenCV中的一种基本的边缘检测函数,属于imgproc模块。其函数模型基于John F.Canny于1986年开发出来的一种多级边缘检测算法,又名Canny算法,至今被很多人认为是边缘检测的最优算法。Canny算法主要步骤包括使用高斯平滑滤波器卷积降噪、计算梯度幅值和方向、非极大值抑制和滞后阈值选取。[7]
在OpenCV中,其具体用法如下:
Canny(detected_edges,detected_edges,lowThreshold, lowThreshold*ratio,kernel_size);
lowThreshold:进行滞后阈值选取时的低阈值;
lowThreshold*ratio:进行滞后阈值选取时用到的高阈值(一般选为低阈值的三倍);
kernel_size:进行卷积降噪时用到的卷积核的大小。
(5)findContours():
findContours()具有强大的寻找轮廓功能,属于imgproc模块。可以在图像中寻找轮廓,并将轮廓的点阵信息存放在一个向量中以供调用。除此之外,用户还可以利用此函数按照轮廓的层级关系指定将要被选择的轮廓种类。具体用法如下:
void cv::findContours(InputOutputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode,int method,Point offset = Point() )
OutputArray hierarchy:函数返回的一个内部包含有轮廓信息的向量。
int mode:使用者想要提取的轮廓层级类型。
int method:检测轮廓时所使用的方法,包括四像素邻域检测和八像素邻域检测。
Point offset:检测时的锚点相对坐标,默认为中心点。
(6)drawContours():
drawContours()函数可以将按照一定格式规则存放在向量中的轮廓信息输出在指定图像上。通常与findContours()联用。具体用法如下:
void DrawContours(Arr*img,Seq*contour,Scalar external_color,Scalar hole_color,int max_level,int thickness=1,int line_type=8,Pointoffset=Point(0,0));
Seq*contour:输入一个存放轮廓信息的向量。
int max_level:向量中存储的轮廓号,使用者可指定想要绘出的特定轮廓。
int thickness:绘出轮廓线条的厚度。
int line_type:绘出轮廓线条的类型,默认值为8。
3 一种光强自适应阈值选取方法过程
3.1 方法概述
在基于图像处理的管道检测过程中,对光照条件的要求总是十分严格。光源的位置、强度、色调等诸多因素都会可能对最终的检测结果造成影响,基于此,该算法提出了一种在管道检测领域中可以自行根据外界光强条件而选取最佳检测阈值的方法。(本文中的最佳检测阈值是指经过二值化分割后直接可以准确提取出故障轮廓的阈值)具体操作方法如下:
(1)图像有效区域的获取。考虑到不同的管道检测系统有着较大的机械结构差异,由于光源和摄像头位置的不同,导致采集到的图像也不尽相同。在图像采集过程中,很有可能因为这些因素而导致采集到的图像存在一部分的未受光照区域(下文称为“无效区域”)。为了尽可能真实地反应出图像的受光照情况,首先需要将获取的图像进行截取操作,以保证操作之后的图像最大程度上地受光照覆盖,以达到最理想的分析效果。本文中对采集到的图像进行灰度化处理之后截取得到长、宽分别为原图长、宽的q倍的中心有效区域(q<1)以去除未受光照的无效区域。
(2)相关量的定义与计算。统计(1)所得图像中像素点总数,记为j;设λ是人工定义的图像基准灰度值,统计图像中灰度值大于λ的像素点总数,记为α。定义灰度光强比例:β=,分别有四个特殊点α1,α2,α3,α4,滿足关系式:
;=λ;
;=2λ;
β1,β2,β3,β4分别为α1,α2,α3,α4四个特殊点对应的灰度光强比例。
对关系式进行求解,得到:
α1=;α2=;α3=;α4=;
(3)有效区域阈值计算前的条件判断。根据条件Ⅰ:α> α4,判断有效灰度图像是否满足光照条件:当满足条件Ⅰ时,继续步骤4);如果不满足条件Ⅰ,即图像中灰度值大于基准灰度值的像素个数较小,反应出检测环境光照强度不足,如果此时仍要继续检测会严重影响故障信息的提取准确度。因此当α<α4时应当停止检测,并提高检测仪器的光源亮度。
(4)基于灰度光强比例的最佳阈值计算。根据灰度值大于λ的像素点总数α,运用函数δ=δ(α)求得最佳阈值δ;
δ=;
函数中ε为特殊设定的阈值补偿量,α1,α2,α3,α4分别为该目标图像最佳阈值函数的分段区间的区间端点,依据α所处的区间,由分段函数计算δ。
通过分析此函数不难发现,该函数有两个最值,δmax= λ,δmin=λ,该函数所选取的所有阈值均在此范围之间。可以通过人工选取λ值使所选阈值较为准确地反应出真实的最佳检测阈值。(本文所选取的λ值为200,后文的实验部分对此有详细阐述)
3.2 应用举例
基于本算法的处理流程,下面将列举对一幅采集到的实际管道图像的处理过程进行说明。
本例证使用了OpenCV3.4.3,并在PC端的Visual Studio 2015编译环境下进行操作。在此基础上,本文还使用了搭载Linux系统的树莓派3b+主板(微处理器型号为ARM Cortex A53系列)进行算法验证,并在管道中进行实际测试。处理效果显示本算法可以在开发板上进行复现,可以应用于实际管道检测产品。下文介绍的操作方法是在PC端上进行的相关操作。
(1)通过摄像头返回一张三通道彩色图像并进行灰度化处理。如图1。
(2)将所得的图片进行截取,以获得中心有效区域。这里的q值为0.6,以下的数据计算均为在此区域内计算得出的。
(3)相关量的计算,此处设定基准灰度值λ=200,需要计算超过基准灰度值的像素总个数j、像素个数α以及灰度光强比例β。(如图2)
判断光照强度是否达到检测要求,并根据公式δ=δ(α)对最佳检测阈值进行求解,(如图3)得到此时的最佳处理阈值δ=190。
4 实验与分析
实验在模拟性半封闭的管道中开展,该管道中有5组人工制造的经典故障。实验共采取了三种不同强度的光照条件(下文分别以光强Ⅰ、光强Ⅱ和光强Ⅲ代替,三种光强依次减弱),每种条件下分别对每组故障进行三次图像采集,并分别对采集到的图像进行实际最佳阈值范围的手动测量和算法对最佳阈值范围的计算测量,共计得到了135组有效阈值范围。下面将选取其中具有代表性的5组实验数据(最强光强条件下的实验三次,普通光强和最弱光强条件下的实验各一次)进行结果分析。
为了得到最接近实际最佳的检测阈值范围,可以通过手动调节二值化阈值参数并人工观测各组图像中故障轮廓能够被识别和检测出的最小临界阈值和最大临界阈值,从而得出对于该故障的实际最佳阈值范围,表1所示的表格展示了实际最佳的检测阈值范围的测量情况;另外,先计算每组故障图片的灰度光强比例β,进而按照本文提出的光强自适应算法得出一个最佳检测阈值,表2所示的表格展示了最佳检测阈值范围的算法预测情况。
通过对比表1和表2中的数据可以发现,算法预测的最佳检测阈值均基本落在实际最佳检测阈值范围内,证明了本算法的有效性。
本文根据表1中的数据绘制了如图4-1和图4-2的阈值分布范围直方图。对比图中数据可以发现,当光强变弱时,最佳检测阈值范围呈下降趋势,同时最佳阈值的区间长度也随着光强变弱而逐渐缩短。因此,如果光强过弱,将会导致检测效果不稳定、误检率高等问题。为解决这些问题,本文建议使用者在检测过程中适当提高工作环境的光照强度。
另外,通过观察阈值分布直方图可以发现,在最强光强下,高亮故障的最佳检测阈值范围为190-200,阴影故障的最佳检测范围为140-150,两区间上(下)限差值为50。因此本文在算法中采用50作为高低阈值区间上(下)限的差值。
5 结语
本文提出了一种管道内基于图像处理的光强自适应检测算法并且展示了对实际管道故障进行的检测实验。该算法具体包括了一种基于灰度光强比例的阈值自适应算法,基于OpenCV视觉库,可以有效地适应检测过程中光照强度条件变化产生的影响,计算出适合该光照条件下的最佳检测阈值范围。实验结果表明,本文提出的算法可以准确地选取最适合当前光强条件的检测阈值,这为后续管道故障图像处理工作打下识别和提取方面的基础。
参考文献
[1]韩文花.油气管道漏磁信号去噪及缺陷重构算法的研究[D].上海:上海交通大學,2006:2-5.
[2]廖志华,甘志梅,吴园.管道焊缝检测视觉图像处理的研究[J].工艺与新技术,2011,40(6):33-36.
[3]林兰极,王库,陈立国.给予DSP的石油管道焊缝检测机器人系统[J].电子测量技术,微处理器应用,2007,30(1):144-146.
[4]ANATOLY D, SERGEY K. The metal magnetic memory method application for monitoring of damage development in steel pipes and welded joints specimens[J].Weld World, 2013,57(12):123-136.
[5]NAVA B L,SOTO C J A.Development of an ulteasonic thickness measurement equipment[M].IEEE Signal Processing Magezine,2002,49(6):848-851.
[6]陈之尧.以OpenCV为基础的图像预处理技术在无人机视频的应用[J].电子技术与软件工程,2018,(16):63-64.
[7]杨少令,刁燕,罗华,徐天雄.一种改进的Canny图像分割算法[J].计算机与现代化,2018,(08):57-60.