基于连通域标记的原油乳状液粒径检测算法
2021-07-16任喜伟何立风宋安玲
任喜伟 何立风 宋安玲 姚 斌 赵 晓
1(陕西科技大学电子信息与人工智能学院 陕西 西安 710021) 2(西安交通大学城市学院 陕西 西安 710018)
0 引 言
在石油工业,开采出来的原油是油、水、乳状液、泥沙等杂质的混合溶液。为了得到相对纯净的石油,需要将原油送至油田联合站,存放在原油储罐内,先后经过沉降、破乳、分离等多道工序后,才能分离出达到冶炼标准的石油,这一系列工艺在石油化工过程中非常重要[1-2]。
沉降罐内等待油水分离的原油,其乳状液液滴大小、分布等特性会随着沉降时间、破乳反应等因素的变化,而随时发生变化,这些改变将直接影响破乳方法的改变和油水分离的效果[3-5]。在实际生产和研究过程中,很多学者认为研究原油乳状液粒径是个十分复杂而又需要深入的课题,对于掌握乳状液稳定性、乳状液粘度等都有重要影响[6-9]。因此,研究原油乳状液粒径特性具有十分重要的意义,除了对开发多相流处理和管输设备非常重要之外,还为指导原油破乳方法和油水分离提供重要的依据[10-11]。
1 现有原油乳状液粒径检测方法
1.1 间接测量方法
张文玲等[12]采用MA2000稳定分析仪,在已知平均迁移速率、油水两相密度差、连续相粘度,以及已知与体系平均粒径建立关系的前提下,通过STOCKES-EINSTEIN定律,计算乳状液液滴的平均粒径大小。此方法为基于液滴迁移速度的间接测量液滴粒径方法。
1.2 直接测量方法
在获取原油乳状液显微图片的前提下,既可以通过人工测量的方法,也可以通过图像分析的方法测量液滴粒径。人工测量精度不高且操作复杂,效率较低;而图像分析的方法则较好。李晓平等[13-14]通过设计、开发液滴粒径测量软件,分别经过预处理、二值化、边缘检测、直径测量等多个图像处理环节,最终获得原油乳状液液滴粒径及其分布。在算法设计中,采用中值滤波预处理算法、全局阈值二值化算法、Laplacian算子边缘检测算法等常规图像处理方法为粒径测量做准备。粒径检测时,通过检测乳状液液滴二值图像像素排列,从左至右、从上到下扫描图像,获得不同像素矩阵样式,判断是否为液滴形状[15]。此外,李晓平等还借用MATLAB图像处理软件中bwlabel、regionprops等函数统计和计算液滴粒径。获得原油乳状液每个液滴所含像素个数后,即可统计每个液滴的面积,再结合图像分辨率及显微镜放大倍数等参数,计算每个液滴的粒径。此方法为基于图像处理的直接测量液滴粒径方法。
1.3 现有测量方法分析
上述两种方法都可以达到测量原油乳状液液滴粒径的目的,并且获得不错的实验效果。但是基于液滴平均迁移速率的间接测量液滴粒径方法只能计算平均粒径,而不能计算单个液滴粒径,且应用存在一定的局限性,不能分析所有液滴的分布情况;基于图像处理的直接测量液滴粒径方法既可以测量单个液滴粒径,也可以计算平均粒径,功能上要优于基于液滴平均迁移速率的液滴粒径间接测量方法。但是,受原油乳状液液滴显微图像形状不规则影响,李晓平等提出的测量方法还不能有效识别,程序运行速度相对较慢,且系统开发环境陈旧,兼容性不足。
本文在分析上述两种方法的前提下,结合原油储罐油水分离实际需求,提出一种基于连通域标记的原油乳状液粒径检测算法,该算法在识别准确率和内存占用率等方面要优于现有测量方法,为进一步研究原油储罐内部介质特性和分布提供帮助。
2 连通域标记及本文算法概述
2.1 连通域及连通域标记
为了更清楚地解释基于连通域标记的原油乳状液粒径检测算法,首先需要了解什么是图像连通域和连通域标记。Gonzalez等[16]在《数字图像处理》一书中指出:对于一个N×M像素大小的二值图像,用b(x,y)表示位于坐标(x,y)处的一个像素值,其中0≤x≤N-1,0≤y≤M-1。二值图像中每个像素的值都为1或0,以区分前景像素和背景像素。没有特别说明,一般假设前景像素的值为1,背景像素的值为0,前景像素也被称为目标像素。此外,为了分析方便起见,一般假设图像边界上的所有像素都是背景像素。如图1所示,灰色方框表示的像素为前景像素,白色方框表示的像素为背景像素[17]。
图1 8邻域目标像素及连通域
对于一个像素b(x,y),其周围的像素b(x-1,y)、b(x,y-1)、b(x+ 1,y)和b(x,y+ 1)被称为4邻域像素。4邻域像素加上b(x-1,y-1)、b(x-1,y-1)、b(x+1,y-1)和b(x-1,y+1)被称为8邻域像素。假如有一条路径,它包含目标像素a1,a2,…,an,其中:a1为像素p,an为像素q,并且所有的ai和ai+1都彼此为8邻域像素,那么称目标像素p和q互为8连通像素(参照图1(a))。二值图像中的一个8连通域是图像中所有8连通像素的集合。一个连通域也称之为一个物体。比如,如图1 所示的二值图像中,有4个8连通域(物体)。
在二值图像中为了区分不同物体,连通域标记是一项必不可少的操作。连通域标记是将二值图像中各个连通域的像素用唯一的标记值进行标记,以区别图像中其他的连通域。通过连通域标记处理,一个二值图像将被转化成为标记图像[18]。例如,图1(b)是图1(a)的标记图像。因此,连通域标记之后,可以通过标记值提取已标记图像中的每一个物体,然后进一步计算物体的形状特征[19]。对于乳状液图像而言,可以统计液滴个数、计算液滴面积和液滴粒径等。
2.2 本文算法概述
本文算法是基于连通域标记的算法,通过对原油乳状液二值图像进行连通域标记,来识别原油乳状液中液滴,统计液滴个数、液滴面积、液滴粒径、平均粒径和液滴分布情况。算法功能流程如图2所示。
图2 算法功能流程
本文算法基本思想描述如下:
① 对所得原油乳状液显微图片进行滤波处理,去除噪声[20-21]。由于本文所用图像的噪声主要是由线路传送产生的,选择中值滤波处理乳状液图像。
② 对滤波后的图像进行二值化处理[22-23]。针对乳状液图像中主要包含油相和水相两种介质状态,本文选择全局阈值Otsu算法对乳状液图像进行二值化。
③ 获取乳状液二值图像,用“0”代表背景像素,用“1”代表前景像素(目标像素),用数组存放“0”、“1”表示像素类别的乳状液二值图像。并为图像四周增加一圈背景像素,标记所有像素为背景像素。
④ 逐行扫描乳状液二值图像,并检测当前像素b(x,y)周围左方b(x-1,y)、左上方b(x-1,y-1)、上方b(x,y-1)、右上方b(x+1,y-1)四个像素的值,把这5个像素所在的区域称之为工作面[17],如图3所示。若当前像素为前景像素,则标记当前像素一个大于0的值作为该像素的标记值,该标记值不能与已标记的其他连通域标记值重复;若当前像素为背景像素,则不用标记,在标记数组中用“0”代替。
图3 连通域标记工作面
⑤ 若当前像素为前景像素,在标记时,如果存在该像素上方像素为“0”,左方像素和右上方像素为“1”(如图4(a)所示),或左上方像素和右上方像素为“1”(如图4(b)所示)时,则取当前像素左方、右上方,或左上方、右上方较小的标记值标记当前像素,并重新遍历已经扫描的像素,将所有已扫描像素中标记值等于较大标记值的像素标记值全部替换为较小标记值,此过程为乳状液连通域标记与连通域等价标记替换过程。
图4 存在等价标记的工作面
⑥ 若不属于④、⑤之情形的,即当前像素左方、左上方、上方、右上方四个像素中至少有一个像素为“1”时,那么取其四个像素中标记值最小的数作为当前像素的标记值。
⑦ 按文献[19]中提出的物体形状特征计算算法获得标记图像中的各个液滴Y[i](i=1,2,…,L)的面积和周长。由于液滴基本为圆形,可以通过式(1)计算液滴Y[i]的粒径。
(1)
式中:D[i]为液滴Y[i]的粒径;A[i]为液滴Y[i]的面积;P[i]为液滴Y[i]的周长。
⑧ 根据原油乳状液图像的解像度(分辨率)和显微镜的放大倍数,液滴Y[i]的实际粒径可由式(2)计算,单位为μm。
(2)
式中:d[i]为液滴Y[i]的实际粒径;H为图像高度;W为图像宽度;DPIH为图像垂直分辨率;DPIW为图像水平分辨率;m1为显微镜物镜放大倍数;m2为显微镜目镜放大倍数。
⑨ 原油乳状液中液滴的平均粒径可由式(3)计算。
(3)
式中:d为平均液滴粒径;d[i]为第i个液滴实际粒径;L为液滴总数。
⑩ 按照粒径d[i]大小排序,可以统计液滴粒径大小分布,以柱状图或曲线图的形式表示。
上述算法标记过程中,用EquivalentLaber(x,y,p)函数表示等价标记替换函数,其中:x和y为等价标记变量,p为当前像素出现在第几行的位置变量。该函数核心部分伪代码如下:
//EquivalentLaber(x,y,p)等价标记替换函数
fori← 1 toi<=pdo
forj← 1 toj<= bmp.Heigh do
if LabelArr[i,j] =x//查找所有已标记像素中是否有等
//价标记x,如果有则替换为y,y LabelArr[i,j] ←y //LabelArr为存放像素标记值的数组 end of if end of for end of for 上述算法计算液滴粒径过程,通过统计LabelArr数组中有多少个不重复的数字便可知图像中有多少个连通域,即液滴个数;统计每个不重复数字出现的次数便可知每个连通域面积,即每个液滴的面积;根据式(2)便可计算每个液滴的粒径;进一步,统计每个液滴的粒径,加上已知的液滴个数,由式(3)便可计算出平均粒径;最后,可统计不同液滴粒径范围内液滴的个数,分析液滴分布情况。 本文实验硬件环境在ThinkPad R400电脑(Intel(R) Core(TM)2 Duo CPU P7570,2.26 GHz,RAM 2 GB)上进行,软件环境在Visual Studio.Net中完成程序设计,所用程序设计语言为C#。在此基础上设计基于连通域标记的原油乳状液粒径检测算法,并开发了原油乳状液粒径检测系统,在系统上进行了验证性实验。本文以文献[13]中所提供的乳状液显微图像为例进行算法验证和对比分析。图像如图5(a)所示,是一幅原油乳状液显微图像,分辨率为611像素×348像素。 (b) 滤波处理后乳状液图像 (c) 二值化处理后乳状液图像图5 原油乳状液显微图像标记前处理 图5(a) 所示图像噪声可能是因传输线路受到突如其来的强烈干扰而产生的椒盐噪声,因此,实验首先对该图像进行中值滤波,得到图5(b);其次采用自适应阈值Otsu二值化方法,得到图5(c);最后运行基于连通域标记的乳状液粒径检测算法,标记图像中连通域(液滴)。标记完毕后,经过统计LabelArr数组中不同数值个数和同一数值的数据个数,通过式(1)-式(3)计算,获得该乳状液图像中共有117个液滴,平均粒径为2.2 μm。 原油乳状液液滴粒径分布如图6所示。可以看出,液滴主要分布在粒径为1~4 μm范围内。手工识别出来的液滴最小粒径不足1.2 μm,而通过本文算法识别出来的液滴粒径可以达到0.32 μm,甚至更小的液滴都能检测得到,检测精度提高。然而,本文算法的准确率未能达到100%,由图5(c)二值图像可知,图像中存在不规则液滴形状,这个液滴正好是图6中117号液滴,肉眼观测可能包含4个液滴。因此,对于这幅乳状液图像而言,本文算法的准确率为96.58%。上述现象可能是由于乳状液中存在不规则杂质、液滴粘连和水包油包水等产生的。不过,对于测量乳状液液滴平均粒径而言,此问题不受影响,这种现象只是在统计液滴个数和计算单个液滴粒径时会产生误差。 图6 液滴粒径分布统计 本文还分别对其他环境下10组原油乳状液显微图像进行算法运行测试,运行结果同上。在乳状液图像中液滴不存在粘连且规则的情况下,本文算法准确率保持在100%;反之,会存在一定误差。目前本文算法还未对这些现象做相应处理,我们将会在接下来的研究中进一步深入分析乳状液显微图像,解决这些问题,提高准确率。 由上述实例分析可知,基于连通域标记的原油乳状液粒径检测算法可以有效应用于原油乳状液显微图像粒径分析中,且获得不错的应用效果。下面将基于连通域标记的乳状液粒径检测算法与第1节提到的两种算法进行对比,分析本文算法的优点。 因为基于液滴迁移速度的液滴粒径间接测量方法只计算平均粒径,且通过公式即可得出结果,不需要编写程序计算,不存在算法复杂度分析;其准确率高低与液滴迁移速度有很大的关系,迁移速度计算准确率高,则平均粒径计算准确率高,反之准确率低。因此,本文主要讨论与文献[13-15]提供的直接测量算法进行对比分析。 (1) 算法准确率分析。文献[13-15]虽未给出算法具体实现过程和伪代码,但根据所给方法简单思路编写程序,经过对比发现,该算法的准确率不高。因为受乳状液液滴形状或拍摄过程偏差影响,液滴并非完全都是标准圆形形状,除了其所属一种情况外,还可能出现其他情况,如一个液滴最左、最右、最上、最下处可能出现2个或2个以上多个像素,且排列组合后形成多种情况。因此,仅通过上述一种情况判断是否为液滴,准确率不高。而本文提出基于连通域标记的原油乳状液粒径检测算法从另外一个角度识别液滴,算法准确性显著提高,不仅可以计算平均粒径,还可以计算每个液滴粒径、统计液滴分布等。 (2) 算法复杂度分析。对于一个N×N的乳状液二值图像,本文算法在最坏情况下的时间复杂度为O(n2)。因为需要创建2个N×N/4大小的数组分别用来记录每个连通域标记值和每个连通域像素个数,所以内存需要分配N2/2大小的数组空间。文献[13,15]算法在最坏情况下的时间复杂度为O(n2),同本文算法一样;因为需要记录每个液滴4个方位的位置,并且需要统计液滴个数和每个液滴所含像素个数,因此,内存需要分配4×N2/2大小的数组空间,比本文算法多占用3倍内存空间。基于液滴迁移速度的液滴粒径间接测量方法不需要编写程序,不需要分析算法复杂度。 分析原油乳状液特性,计算乳状液液滴粒径、液滴面积、液滴个数、液滴分布等,对原油乳状液破乳过程有重要的指导意义,进一步,对精确测量原油储罐油水界面,顺利完成油水分离过程提供保障。因此,本文在深入探讨现有乳状液粒径检测方法的前提下,提出基于连通域标记的原油乳状液粒径检测算法。该算法需要在乳状液显微图像滤波、二值化处理之后,进行连通域标记,并进行等价标记替换,最后经过统计、计算,才能获得液滴个数,计算液滴粒径和分布等信息。通过算法应用与对比分析可知:基于连通域标记的乳状液粒径检测算法可提供相对准确的计算结果,并且占用较小的内存空间。3 实验及分析
3.1 实验环境与过程
3.2 实验对比与分析
4 结 语