数字图像处理与深度学习技术应用 课件 第9章 图像分割与测量_第1页
数字图像处理与深度学习技术应用 课件 第9章 图像分割与测量_第2页
数字图像处理与深度学习技术应用 课件 第9章 图像分割与测量_第3页
数字图像处理与深度学习技术应用 课件 第9章 图像分割与测量_第4页
数字图像处理与深度学习技术应用 课件 第9章 图像分割与测量_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章图像分割与测量目录9.1概述9.2阈值法分割9.2.1直方图门限选择法9.2.2半阈值选择法9.2.3迭代阈值法9.2.4Otsu阈值法9.2.5自适应阈值法9.2.6分水岭算法9.3投影法分割9.3.1水平投影分割9.3.2垂直投影分割9.4轮廓检测9.4.1领域判断轮廓法9.4.2边界跟踪法9.4.3区域增长法9.4.4轮廓检测与拟合9.5目标物体测量9.5.1区域标记9.5.2面积测量9.5.3周长测量9.6最小外包形状检测9.6.1最小外包矩形9.6.2最小外包圆形9.6.3最小外包三角形9.6.4最小外包椭圆9.7霍夫检测9.7.1霍夫直线检测9.7.2霍夫圆检测9.1概述概述分割的目的是将图像分为一些有意义的区域,如目标或前景,然后可以对这些区域进行描述。图像分割的基本思路:从简到难,逐级分割;控制背景环境,降低分割难度,把焦点放在增强感兴趣的对象,缩小不相干图像成分的干扰上。图像分割的方法有多种,依据工作对像来分,可分为点相关分割和区域相关分割;按算法分类,可分为阀值法,界限检测法,匹配法,跟踪法等。9.2阈值法分割9.2.1直方图门限选择法理论基础设图像为f(i,

j),其灰度级范围为[,],设T为阈值,是和内任一值,可得一幅二值图像或者

图9-1双峰灰度级直方图图9-2多峰值灰度级直方图效果展示根据直方图9-3所示,将两峰之间的谷底140作为阈值。

图9-3直方图19.2.2半阈值选择法理论基础希望阈值化处理后只把图像的背景表示成二值图像(即背景不是最白(用1表示)就是最黑(用0表示)),而图像中的物体仍为多值图像,此时,可采用半阈值化技术,把物体从背景中分离出来。

或者

cv2.calcHist()函数用于统计图像直方图信息hist=cv2.calcHist(image,channel,mask,histSize,range,accumulate)hist:表示返回的统计直方图,数组内的元素是各个灰度级的像素个数;image:表示原始图像,该图像需要用“[]”括起来;channel:表示指定通道编号,通道编号需要用“[]”括起来;mask:表示掩模图像,当统计整幅图像的直方图时,将这个值设为None;当统计图像某一部分的直方图时,需要用到掩模图像;histSize:表示BINS的值,该值需要用“[]”括起来;range:表示像素值范围;accumulate:表示累计标识,默认值为False。如果被设置为True,则直方图在开始计算时不会被清零,计算的是多个直方图的累计结果,用于对一组图像计算直方图。该参数是可选的,一般情况下不需要设置。函数说明效果展示根据直方图9-5所示,将两峰之间的谷底140作为阈值。

图9-5直方图2效果展示

图9-6半阈值选择图像分割处理效果图9.2.3迭代阈值法理论基础自动计算出比较合适的分割阈值,步骤:(1)选择阈值T1,可选择平均灰度值来作为初始阈值,或者指定一个阈值;(2)通过阈值T1,把图像的像素按照数值大小分成两组R1和R2,其中,像素值小于T1的归为R1,像素值大于T1的归为R2;(3)计算这两组平均灰度值μ1和μ2;(4)计算新的阈值T2:T2=(μ1+μ2)/2;(5)判断T2是否等于T1,如果不相等,则令T1=T2,转步骤2;否则,就获得了所需要的阈值,执行步骤6;(6)根据最终阈值T1,进行二值化。函数说明matplotlib模块可以使用其中的hist()函数来直接绘制图像的直方图。n,bins,patches=matplotlib.pyplot.hist(src,bins=10,normed=False,histtype=u'bar',**kwargs)返回值:

n:直方图向量,是否归一化由参数normed设定。当normed取默认值时,n即为直方图各组内元素的数量(各组频数);

bins:返回各个bin的区间范围;

patches:返回每个bin里面包含的数据,是一个list;参数:

src:表示原始图像数据,必须将其转换为一维数据;

bins:直方图的柱数,可选项,默认为10;

normed:是否将得到的直方图向量归一化。默认为0;

histtype:直方图类型,这些类型有:'bar','barstacked','step','stepfilled'。效果展示9.2.4Otsu阈值法理论基础Otsu算法主要采用最大类间方差法,将图像分成背景和前景两部分,要求这两个部分的类内离散度最小,类间离散度最大,使两类间方差最大来确定最佳阈值。根据阈值T将图像中的像素点分为C1和C2两类,则:ω0=N0/M×Nω1=N1/M×NN0+N1=M×Nω0+ω1=1μ=ω0*μ0+ω1*μ1g=ω0(μ0-μ)^2+ω1(μ1-μ)^2将式(9-12)代入式(9-13),得到等价公式:

g=ω0ω1(μ0-μ1)^2在从0到255的范围内,不断调整阈值T;分别计算上式,找到上述最大的g(T),则对应的T即为Otsu算法自动选取的阈值。函数说明在threshold()函数传递type参数时,多传递一个参数cv2.THRESH_OTSU即可,必须把阈值设置为0。retval,dst=cv2.threshold(src,thresh,maxval,type)retval:表示返回的阈值;dst:表示输出的图像;src:表示要进行阈值分割的图像,可以是多通道的图像;thresh:表示设定的阈值;maxval:表示type参数,cv2.THRESH_OTSU;效果展示图像Ostu算法阈值处理效果如图9-8所示。左侧为原始图像,右侧为处理后的图像。图9-8Ostu算法阈值处理效果图9.2.5自适应阈值法理论基础自适应阈值可以看成一种局部性的阈值,通过规定一个区域大小,比较处理像素点与区域大小里面像素点的平均值—阈值(或者其他特征)的大小关系确定这个像素点是黑还是白。理想的情况下,色彩均衡的图像,对整个图像使用单个阈值进行阈值化就会成功。但是,受到多种因素的影响,图像的色彩并不会很均衡,在这种情况下,使用局部值(又称自适应值)进行分割可以产生好的结果。函数说明在OpenCV中提供函数cv2.adaptiveThreshold()来实现自适应阈值处理,其一般格式为:dst=cv2.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,c)dst:输出的图像;src:输入图,只能输入单通道图像,通常来说为灰度图;maxval:当像素值超过了阈值(或者小于阈值,根据type来决定)时,所赋予的值adaptiveMethod:阈值的计算方法,包含以下2种类型:

cv2.ADAPTIVE_THRESH_MEAN_C:区域内均值;

cv2.ADAPTIVE_THRESH_GAUSSIAN_C:区域内像素点加权和,权重为一个高斯窗口;thresholdType:二值化操作的类型BlockSize:图片中区域的大小;C:阈值计算方法中的常数项。效果展示图像自适应阈值分割处理效果如图9-9所示。图9-9(a)为原始图像,图9-9(b)为采用权重相等方式的局部阈值处理;图9-9(c)为采用权重为高斯分布的局部阈值处理。可以看出图9-9(c)相对于图9-9(b)保留了大量的细节信息。9.2.6分水岭算法理论基础分水岭分割是基于自然的启发算法来模拟水流通过地形起伏的现象,从而研究总结出来的一种分割方法,其基本原理是将图像特征看作地理上的地貌特征,在分割中,它会把与邻近像素间的相似性作为重要的参考依据,从而将在空间位置上相近和灰度值相近的像素点互相连接起来构成一个封闭的轮廓。具体实现方案如下:(1)对灰度图进行二值化处理,增强目标前景,去除无用背景(2)利用形态学函数,找到背景并标记背景;确定背景信息B(3)利用距离变换函数cv2.distanceTransform()函数,确定前景信息F距离变换函数实现步骤:理论基础①将输入图片转换为二值图像,前景设置为1,背景设置为0。②Chamfer倒角模版遍历像素顺序如图9-10所示,需要对图像进行两次扫描。依次选取左、左上、上、右下,等像素计算见(9-20)式,实现距离变换。其中,D表示距离包括欧式距离,棋盘距离和麦哈顿距离;理论基础掩膜模板mask为maskL;f(p)为像素点p的像素值。③依据图9-10(b)所示的后向模板maskR再次遍历图像,依次选取右、右下、下、左下等像素计算(9-20)式,实现距离变换。④根据模板maskL和maskR的扫描,得到最终的距离变换图像。(4)获取边缘,确定未知区域UN图像中有了确定前景F和确定背景B,剩下的区域就是未知区域UN了。未知区域UN=

图像O

-

确定背景B

-

确定前景F未知区域UN=(图像O

-

确定背景B)-

确定前景F上式中的“图像O

-

确定背景B”,可以通过对图像进行形态学的开运算操作得到。(5)利用函数cv2.connectedComponent(),构建标记图像(marker),对目标进行标注使用函数cv2.connectedComponents()进行标注,该函数会将背景标注为0,将其他的对象使用从1开始的正整数标注。函数说明使用cv2.watershed()函数实现分水岭算法,(1)距离变换函数distanceTransformdst=cv2.distanceTransform(src,distanceType,maskSize[,dstType])dst:表示计算得到目标函数图像。可以是8位或32位浮点数,尺寸和src相同;src:表示原始图像,必须是8通道的二值图像;DistanceType:表示距离类型。常用距离类型标识符和含义如表9-1所示。(2)图像的标注cv2.connectedComponents()函数对图像进行标注。ret,markers=cv2.connectedComponents(image)ret:连通域的数目,表示标注的数量;markers:表示标注的结果图像,图像上每一个像素的标记,用数字1、2、3、…表示(不同的数字表示不同的连通域),0表示背景;image:表示原始图像,必须是8通道的图像。函数说明(3)分水岭分割cv2.watershed()函数实现图像的分水岭操作。img=cv2.watershed(image,markers)img:表示分水岭操作的结果;image:表示输入图像;markers:表示32位单通道标注结果。效果展示图像分水岭算法处理效果如图9-20所示,左面的图像是原始的灰度图,右边的图像是对其进行分水岭操作后的图像。

图9-20分水岭算法处理效果图9.3投影法分割9.3.1水平投影分割理论基础水平投影分割是沿着图像水平方向,统计水平方向像素的累加计算量的集合,通过水平投影可以取得目标物体所在的行数。实现步骤:①将图像二值化,使物体为黑,背景为白。②循环各行,依次判断每一列的像素值是否为黑,统计该行所有黑像素的个数。设该行共有M个黑像素,则把该行从第一列到第M列置为黑。③显示该图。效果展示通过水平投影可以取得汉字所在的行数,图像投影处理效果如图9-21所示。图9-21水平投影可分割汉字所在的行数9.3.2垂直投影分割理论基础垂直投影分割是沿着图像垂直方向,统计垂直方向像素的累加计算量的集合,通过垂直投影可以取得目标物体所在的列数。实现步骤:①将图像二值化,使物体为黑,背景为白。②循环各列,依次判断每一行的像素值是否为黑,统计该列所有黑像素的个数。设该列共有M个黑像素,则把该列从第一行到第M行置为黑。③显示该图。效果展示图像投影处理效果如图9-22所示,垂直投影可获得汉字所在的列数,因此,垂直投影可以分割每个汉字。图9-22垂直投影可以分割每个汉字9.4轮廓检测9.4.1邻域判断轮廓法理论基础如果围绕像素点的8点邻域的灰度值和中心像素点的灰度值相同,就认为该点是物体内部,可以删除;否则,认为该点是物体的边缘,需要保留。依次处理物体中的每一个像素点,最后剩下的就是物体的轮廓。效果展示图像轮廓提取处理效果如图9-23所示。左侧为原始图像,右侧为处理后的图像。图9-23轮廓提取处理效果图

9.4.2边界跟踪法理论基础边界跟踪的基本方法是:先根据某些严格的“探测准则”找出目标物体轮廓上的像素,再根据这些像素的某些特征用一定的“跟踪准则”找出目标物体上的其他像素。图9-24边界跟踪示意图理论基础中心像素可以跟踪的方向有8个,对每个方向制订了方向编号及偏移量,当找到起始点,把该点记录下来,定义初始的跟踪方向是左上方0方向,判断该点是否为目标点,若是则把该目标点作为跟踪的起始点,逆时针旋转90度作为新的跟踪方向,继续检测该新的跟踪方向上的点;若不是则沿顺时针旋转45度,直至找到目标点。找到目标点后,在当前跟踪方向的基础上,逆时针旋转90度作为新的跟踪方向,用同样的方法跟踪下一个边界点,直到回到起始点为止。效果展示图像外边界跟踪处理效果如图9-25所示。左侧为原始图像,右侧为处理后的图像。图9-25外边界跟踪处理效果9.4.3区域增长法理论基础区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体流程是先对每个需要分割的区域找一个种子像素作为生长起点,然后将种子像素和周围邻域中与种子像素有相同或相似性质的像素合并到种子像素所在的区域中。将这些新像素当作新的种子继续上面的过程,直到没有满足条件的像素可被包括进来。这样一个区域就生长成了。

图9-26区域增长法示意图函数说明(1)None=dWindow(winname[,flags])该函数是OpenCV中用于创建窗口的函数,窗口通常用来显示图像。Winname:窗口名称;Flags:可选参数,例如有cv2.WINDOW_NORMAL、cv.WINDOW_AUTOSIZE等。(2)None=cv2.setMouseCallback(winname,onMouse,userdata)该函数是OpenCV中常需要用到的鼠标回调函数,以此实现人机交互。Winname:绑定的窗口名称;OnMouse:鼠标的回调函数;Userdata:可选参数。函数说明(3)在OpenCV中提供了cv2.circle()函数来绘制圆image=cv2.circle(image,center,radius,color[,thickness[,lineType]])image:表示绘制的载体图像;center:表示圆心;radius:表示圆的半径;color:表示绘制圆的线条的颜色;thickness:表示绘制圆的线条的粗细;lineType:表示绘制圆的线条的类型。函数说明(4)在OpenCV中提供了cv2.putText()函数,用于在图形上绘制文字mage=cv2.putText(image,text,org,fontFace,fontScale,color[,thickness[,lineType[,bottomLeftOrigin]]])image:表示绘制的载体图像;text:表示要绘制的字体;org:表示绘制字体的位置;fontFace:表示字体类型;fontScale:表示字体大小;color:表示绘制文字的线条的颜色;thickness:表示绘制文字的线条的粗细;lineType:表示绘制文字的线条的类型;bottomLeftOrigin:表示文字的方向。效果展示

图9-27鼠标单击效果图9.4.4轮廓检测与拟合图像轮廓是指将边缘信息连接起来形成的一个整体。图像轮廓是图像中非常重要的一个特征,通过对图像轮廓进行操作,能够获取目标图像的大小、位置和方向等信息。图像的轮廓由一系列的点组成,这些点以某种方式表示图像中的一条曲线。所以,图像轮廓的绘制就是将检测到的边缘信息和图像的前景信息进行拟合,从而得到图像的轮廓。函数说明在OpenCV中提供了cv2.findContours()和cv2.drawContours()函数来实现对图像轮廓的查找与绘制。(1)cv2.findContours()函数一般格式为:image,contours,hierarchy=cv2.findContours(image,mode,method)image:表示8位单通道原始图像。mode:表示轮廓检索模式。(2)cv2.drawContours()函数一般格式为:image=cv2.drawContours(image,contours,contourIdx,color[,thickness[,lineTypehierarchy[,maxLevel[,offset]]]]])函数说明image:表示待绘制轮廓的图像。contours:表示需要绘制的轮廓。contourIdx:表示需要绘制的边缘索引。color:表示绘制的轮廓颜色。绘制的颜色,用BGR格式表示。thickness:表示绘制轮廓的粗细。如将该值设置为“-1”,则表示要绘制实心轮廓。lineType:表示绘制轮廓所选用的线型。hierarchy:对应函数cv2.findContours()所输出的层次信息。maxLevel:控制所绘制轮廓层次的深度。offset:表示轮廓的偏移程度。该参数使轮廓偏移到不同的位置展示出来。效果展示

(a)原图(b)轮廓绘制(c)Mask图

效果展示

(d)提取的前景(e)Canny检测的边缘(f)绘制的边缘信息

9.5目标物体测量9.5.1区域标记函数说明(1)在OpenCV中可以通过cv2.moments()函数来获取图像的轮廓特征moments=cv2.moments(img,binaryImage=False)img:可以是灰度图像或者二值图像;binaryImage:表示输入的二值图像是否已经是经过二值化处理的。如果是,则传入True,否则传入False。moments:返回的矩特征。cv2.moments函数的返回值为一个字典,包含了图像矩及其他信息。字典的键与矩的特征有关,例如中心矩、二阶矩等。m00=moments['m00'] #面积cx=moments['m10']/moments['m00'] #x坐标cy=moments['m01']/moments['m00'] #y坐标其中,m00表示图像的面积,cx和cy分别表示图像的重心。效果展示9.5.2面积测量在OpenCV中,cv2.contourArea()函数可以用于计算轮廓的面积,其一般格式为:retval=cv2.contourArea(contour[,booled])retval:表示返回的轮廓面积;contour:表示输入的轮廓;booled:表示轮廓的封闭性。函数说明效果展示9.5.3周长测量函数说明在OpenCV中,函数cv2.arcLength()可以用于计算轮廓的长度,其一般格式为:retval=cv2.arcLength(contour,booled)其中:retval:表示返回的轮廓周长;contour:表示输入的轮廓;booled:表示轮廓的封闭性。效果展示图9-35周长计算效果图9.6最小外包形状检测9.6.1最小外包形状检测函数说明在OpenCV中提供了cv2.minAreaRect()函数用来绘制轮廓的最小外包矩形框ret=cv2.minAreaRect(points)ret:表示返回的矩形特征信息;points:表示输入的轮廓。返回值ret的结构不符合cv2.drawContours()函数的参数结构要求。因此,必须使用cv2.boxPoints()函数将上述返回值ret转换为符合要求的结构。cv2.boxPoints()函数的一般格式是:points=cv2.boxPoints(box)box:表示cv2.minAreaRect()函数返回值类型的值;points:表示返回的符合结构的矩形特征信息。效果展示图9-36最小外包矩形示意图9.7霍夫检测9.7.1霍夫直线检测理论基础霍夫变换(HoughTransform)的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的。图9-40极坐标系下的直线方程(1)极坐标系下的直线方程ρ

=

xcosθ

+

ysinθ(9-21)(2)极坐标系中的一点对应θ从0~2π变化的直线(3)θ角度由1°逐渐递增可获取对应的直线参数ρ(4)同一条直线上的点,对应相同的(ρ,θ)图9-40极坐标系下的直线方程(5)参数空间(θ,ρ)量化,构建累加器矩阵,统计相同(θ,ρ)的出现次数霍夫直线检测,就是将参数空间(θ,ρ)量化成m×n(m为θ的等份数,n为ρ的等份数)个单元。理论基础算法流程:①首先就是对图像进行Canny边缘提取;②将参数空间(θ,ρ)量化成m×n个单元,并设置累加器矩阵Q[m×n],并把累加器的初始值置为零;③将每一个边缘点的直角坐标系代入式ρ=xcosθ+ysinθ,然后将θ0~θm−1​也都代入其中,分别计算出相应的值ρj;④在参数空间中,找到每一个Q(θi,ρj)所对应的单元,并将该单元的累加器加1;⑤待图像xy坐标系中的所有点都进行运算之后,检查参数空间的累加器,指定一个阈值,输出多条直线。函数说明(1)cv2.HoughLines()函数来实现标准霍夫直线检测,lines=cv2.HoughLines(image,rho,theta,threshold)lines:表示函数的返回值,是检测到的直线参数;image:表示输入的8位单通道二值图像

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论