




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章图像形态学处理8.1概述基本思想:用一定形态的结构元素去量度和提取图像中的对应形状,达到分析和识别目的。可用于图像处理的各个方面,包括图像分割、特征抽取、边界检测等。对图像处理的理论和技术产生了重大影响,已经构成一种新的图像处理方法和理论,成为一个重要研究领域。8.1形态学基本概念这门学科在计算机文字识别,计算机显微图像分析,医学图像处理,工业检测等方面都取得了非常成功的应用。形态学方法已成为图像应用领域工程技术人员的必备工具。目前,有关数学形态学的技术和应用正在不断地研究和发展。形态学作用数学形态学的数学基础和所用语言是集合论,具有完备的数学基础。数学形态学的应用可以简化图像数据,保持它们基本的形状特性,并除去不相干的结构。元素和集合:形态学数学基础形态学数学基础2)交集、并集和补集3)
包含、击中与击不中形态学作用结构元素:形态学变换中的基本元素,是为了探测图像的某种结构信息而设计的特定形状和尺寸的图像,称为收集图像结构信息的探针。结构元素有多种类型:如圆形、方形、线型等,可携带知识(形态、大小、灰度和色度信息)来探测、研究图像的结构特点。形态学基本方法
二值形态学中的运算对象是集合。设X为图像集合,B为结构元素,数学形态学运算是用B对X进行操作。需要指出,实际上结构元素本身也是一个图像集合。形态学基本方法形态学运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、击中击不中变换等。
形态学4个基本算子:膨胀、腐蚀、开启和闭合组成。这些基本运算还可推导和组合成各种数学形态学实用算法。形态学算子腐蚀:是将图像X中每一与结构元素B全等的子集B+x收缩为点x。腐蚀作用:消除物体边界点,使边界向内部收缩,可以把小于结构元素的物体去除。选取不同的大小的结构元素,去除不同大小的物体。如两个物体间有细小的连通,通过腐蚀可将两个物体分开。腐蚀运算S=
S--腐蚀后的二值图像集合;B--腐蚀的结构元素,每一个元素取值为0或1,它可以组成任何一种形状的图形,在B图形中有一个中心点;X--经过二值化后的像素集合。用B来腐蚀X得到的集合S,S是由B完全包括在X中时B的当前位置的集合。基本方法通常是拖动结构元素在X域移动,在每一个位置上,当结构元素B的中心点平移到X图像上的某一点(x,y)。如果结构元素内的每一个像素都与以(x,y)为中心的相同邻域中对应像素完全相同,那么就保留(x,y)像素点;对于不满足条件的像素点则全部删除,达到边界向内收缩效果。基本方法B+x的三种可能的状态:
M1说明B+x与X相关最大,M3说明B+x与X不相关,而M2说明B+x与X只是部分相关。腐蚀运算满足M1的点x的全体构成结构元素与图像最大相关点集,这个点集称为B对X的腐蚀,X用B腐蚀的结果:B完全包括在X中时B的原点位置的集合。腐蚀运算(a)原图
(b)结构元素图
(c)腐蚀示意图腐蚀作用腐蚀作用腐蚀作用腐蚀:消除物体边界点。结构元素取3×3块,使边界减少一个像素。小于结构元素的物体(毛刺、小凸起)去除。选取不同大小结构元素,在原图像中去掉不同大小的物体。如果两个物体之间有细小的连通,当结构元素足够大时,可以将两个物体分开。
腐蚀作用作用:与腐蚀相反。对二值化物体边界点扩充,将与物体接触的所有背景点合并到该物体中,使边界向外部扩张。如果两个物体之间的距离比较近,会把两个物体连通到一起。对填补图像分割后物体中的空洞有用。膨胀如果结构元素为一个圆盘:膨胀:填充图像中的小孔(比结构元素小的孔洞)及图像边缘处的小凹陷部分。腐蚀:消除图像边缘小的成分,并将图像缩小,从而使其补集扩大。膨胀和腐蚀:并不互为逆运算,可以级连结合使用。膨胀作用
S=X
通常是拖动结构元素在X图像域移动,在每一个位置上,当结构元素B的中心点平移到X图像上的某一点(x,y),如果结构元素的像素与目标物体至少有一个像素相交,保留(x,y)像素点,达到边界向外扩张。膨胀算子将X中的每一个点x扩大为B+x:膨胀作用(a)原图(b)结构元素图(c)膨胀示意图膨胀作用膨胀作用8.2图像腐蚀8.2.1水平腐蚀8.2.1水平腐蚀水平腐蚀的原理同上面介绍的相同,使用的结构元素不同,水平腐蚀所用的结构元素:1)得图像的首地址及宽和高,并二值化。2)开辟缓冲区,初始化为255。3)由于使用1×3的结构元素结构[0,0,0],从第1行第2列开始,将像素点赋为0,检查这个像素点,判断该像素点的前一点和后一点中是否有背景点,有则将检查的像素点值赋为255,否则保持不变。4)循环步骤3,直到处理全部像素点。实现步骤函数说明(1)retval=cv2.getStructuringElement(shape,ksize,anchor=None)retval:返回构造的特定结构;shape:代表形状类型,其中类型有以下三种:
cv2.MORPH_RECT,矩形结构元素,所有元素值都是1;
cv2.MORPH_CROSS,十字形结构元素,对角线元素值都是1;
cv2.MORPH_ELLIPSE,椭圆形结构元素;ksize:代表形状元素的大小,写法为元组(width,height);anchor:坐标(x,y),元素内的锚定位置。默认值为(-1,-1)即结构化元素的中心。函数说明(2)retval=cv2.erode(src,k[,anchor[,iterations[,boderType[,boderValue]]]])retval:表示返回的腐蚀处理结果;src:表示原始图像,即需要被腐蚀的图像;k:表示腐蚀操作时所要采取的结构类型;anchor:表示锚点的位置,默认为(-1,-1),表示在结构元素的中心;iterations:表示腐蚀擦操作的迭代次数;boderType:表示边界样式,一般默认使用BORDER_CONSTANT;boderValue:表示边界值,一般使用默认值。效果图效果展示8.2.2垂直腐蚀8.2.2垂直腐蚀垂直腐蚀所用的结构元素:,
(1)得原图像的首地址及宽和高。(2)开辟缓冲区,并初始化为255。(3)由于使用3×1的结构元素结构,从第2行第1列开始,将像素点赋为0,检查这个像素点,判断该像素点的上一点和下一点中是否有背景点,有则将检查的像素点赋为255,否则保持不变。(4)循环步骤3,直到处理全部像素。实现步骤效果图效果展示8.2.3全方向腐蚀8.2.3全方向腐蚀全方向腐蚀所用的结构元素:(1)得原图像的首地址及宽和高。(2)辟缓冲区,并初始化为255。(3)为用到3×3的结构元素,定义一个一维数组S[9];(4)从第2行第2列开始,利用结构元素数组判断除中心点外,四个为0的位置中是否有背景点,有则将检查的像素点赋为255,否则保持不变。(5)循环步骤4,直到处理完全部像素点。
实现步骤效果图作用:图像的边界点消除,使图像沿着边界向内收缩。操作过程:使用一个结构元对像素进行逐个遍历,每一次判定的点都是与结构元中心点所对应的点。根据结构元与被腐蚀图像的关系来确定腐蚀的结果。
与结构元完全相同时,结构元对应的中心点为1,与结构元不完全相同时,结构元对应的中心点为0。常见的结构元有:
矩形结构、椭圆形结构、十字交叉形结构和线性结构等。
腐蚀---小结
Python实现dst=cv2.erode(src,k[,anchor[,iterations[,boderType[,boderValue]]]])·dst表示返回的腐蚀处理结果。·src表示原始图像,即需要被腐蚀的图像。·k表示腐蚀操作时所要采取的结构类型。两种方式.1.通过自定义得到,2.通过cv2.getStructuringElement()函数得到·anchor表示锚点的位置,默认为(-1,-1),表示在结构元的中心。·iterations表示腐蚀操作的迭代次数。·boderType表示边界样式,一般默认使用BORDER_CONSTANT。·boderValue表示边界值,一般使用默认值。
【例1】使用cv2.erode()函数实现图像的腐蚀操作。importcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/aaa.jpg")#读取一幅图像cv.imshow("image",image)#显示原始图像k=np.ones((3,3),np.uint8)#构建3×3的矩形结构元img=cv.erode(image,k,iterations=3)
#腐蚀操作,迭代3次cv.imshow("erode",img)#显示腐蚀后的图像cv.waitKey()cv.destroyAllWindows()
a是原始图像;b是迭代1次的腐蚀结果;c是迭代2次的腐蚀结果;d是迭代3次的结果。在iterations=3时,腐蚀效果最好。
腐蚀程度随迭代次数而加剧
效果展示8.3图像膨胀8.3.1水平膨胀理论基础水平膨胀所用的结构元素如图8-11所示
图8-11水平膨胀结构元素示意图实现步骤(1)retval=cv2.dilate(src,k[,anchor[,iterations[,boderType[,boderValue]]]])retval:表示返回的膨胀处理结果;src:表示原始图像,即需要被膨胀的图像;k:表示膨胀操作时所要采取的结构类型;anchor:表示锚点的位置,默认为(-1,-1),表示在结构元素的中心;iterations:表示膨胀操作的迭代次数;boderType:表示边界样式,一般默认使用BORDER_CONSTANT;boderValue:表示边界值,一般使用默认值。效果展示
图8-12水平膨胀处理效果图8.3.2垂直膨胀理论基础垂直膨胀所用的结构元素如图8-13所示.图8-13垂直膨胀结构元素示意图效果展示8.3.3全方向膨胀膨胀操作与腐蚀操作刚好相反,它是由图像的边界点处向外部扩张。与腐蚀操作一样,在图像的膨胀操作过程中也是逐个像素地遍历待膨胀图像,并且根据结构元与待膨胀图像的关系来决定膨胀的效果。与结构元完全相同时,结构元对应的中心点为1,与结构元有部分相同时,结构元对应的中心点为1。膨胀
Python实现dst=cv2.dilate(src,k[,anchor[,iterations[,boderType[,boderValue]]]])•dst表示返回的膨胀处理结果。•src表示原始图像,即需要被膨胀的图像。•k表示膨胀操作时所要采取的结构类型。它由两种方式得到,第一种是通过自定义得到,第二种是通过cv2.getStructuringElement()函数得到•anchor表示锚点的位置,默认为(-1,-1),表示在结构元的中心。•iterations表示膨胀操作的迭代次数。•iterations表示膨胀操作的迭代次数。•boderType表示边界样式,一般默认使用BORDER_CONSTANT。•boderValue表示边界值,一般使用默认值。
【例2】使用cv2.dilate()函数实现图像的膨胀操作。importcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/shortA.jpg")#读取一幅图像cv.imshow("image",image)#显示原始图像k=np.ones((3,3),np.uint8)#构建3×3的矩形结构元img1=cv.dilate(image,k,iterations=1)
#膨胀操作,迭代1次img2=cv.dilate(image,k,iterations=2)#膨胀操作,迭代2次img3=cv.dilate(image,k,iterations=3)#膨胀操作,迭代3次cv.imshow("dilate1",img1)#显示膨胀后的图像cv.imshow("dilate2",img2)#显示膨胀后的图像cv.imshow("dilate3",img3)#显示膨胀后的图像cv.waitKey()cv.destroyAllWindows()a是原始图像;b是迭代1次;c是迭代2次;d是迭代3次。膨胀程度随迭代次数而加剧。理论基础全方向膨胀所用的结构元素如图8-15所示效果展示图8-16全方位膨胀处理效果图8.4图像开运算与闭运算由膨胀和腐蚀两个运算的复合与集合操作(并、交、补等)组合成的所有运算构成。开运算:先对图像腐蚀后膨胀。闭运算:先对图像膨胀后腐蚀。使用同一个结构元素。8.4图像开启与闭合8.4.1图像开运算开运算:能够去除孤立的小点,毛刺和小桥(即连通两块区域的小点),消除小物体、平滑较大物体的边界,同时并不明显改变其面积。不过这一恢复不是信息无损的,即它们通常不等于原始图像。8.4.1图像开运算开运算:先对图像腐蚀后膨胀。腐蚀运算:如果B上的所有点都在X的范围内,则该点保留,否则将该点去掉。膨胀运算:如果B上有一个点落在X的范围内,则该点就为黑。开运算开运算和闭运算依据腐蚀和膨胀的不可逆性,演变而来的。开运算:能够去除孤立的小点,毛刺和小桥(即连通两块区域的小点),消除小物体、平滑较大物体的边界,同时并不明显改变其面积。不过这一恢复不是信息无损的,即它们通常不等于原始图像。开运算B的中心点和X上的点一个一个地对比。开运算经过开运算后,能够去除孤立的小点,毛刺和小桥(即连通两块区域的小点),平滑较大物体的边界,同时并不明显改变面积。开运算作用(1)获得原图的首地址及图像的高和宽。(2)调用腐蚀函数对图像进行腐蚀处理。(3)调用膨胀函数对腐蚀后的图像进行膨胀处理。实现步骤效果图函数说明retval=cv2.morphologyEx(src,op,k[,anchor[,iterations[,boderType[,boderValue]]]])retval:表示返回运算的结果;src:表示原始图像;op:表示操作类型,当设置为cv2.MORPH_GRADIENT时,表示对图像进行梯度运算,当设置为cv2.MORPH_OPEN和cv2.MORPH_CLOSE时,可以对图像实现开运算与闭运算的操作;参数k、anchor、iterations、boderType和boderValue与cv2.dilate()函数的参数用法一致。效果展示图8-18开运算处理效果图8.4.2图像闭运算闭运算是通过对腐蚀和膨胀的另一种不同次序的执行而得到的。闭运算:先膨胀后腐蚀,其功能是用来填充物体内细小空洞、连接邻近物体、平滑其边界,同时不明显改变其面积。
8.4.2图像闭运算膨胀运算:如果B上有一个点落在X的范围内,则该点就为黑。腐蚀运算:如果B上的所有点都在X的范围内,则该点保留,否则将该点去掉。闭运算闭运算是通过对腐蚀和膨胀的另一种不同次序的执行而得到的,闭运算是先膨胀后腐蚀的过程,其功能是用来填充物体内细小空洞、连接邻近物体、平滑其边界,同时不明显改变其面积。闭运算作用B的中心点和X上的点一个一个地对比。闭运算经过闭运算后,断裂的地方被弥合了。闭运算能够填平小孔,弥合小裂缝,而总的位置和形状不变。闭运算作用闭运算作用(1)获得原图像的首地址及图像的高和宽。(2)调用膨胀函数对原图像进行膨胀处理。(3)调用腐蚀函数对膨胀后的图像进行腐蚀处理。实现步骤效果展示图8-20闭运算处理效果图开运算和闭运算是以腐蚀和膨胀为基础操作的一种形态学处理方法。开运算与闭运算都以腐蚀和膨胀操作为基础。开运算是先将图像腐蚀,再膨胀。闭运算是先将图像膨胀,再腐蚀。开运算与闭运算---小结小结1.开运算:
先腐蚀后膨胀可以消除亮度较高的细小区域、在纤细点处分离物体。对于较大物体,在不明显改变面积下平滑边界。2.闭运算:图像先膨胀后腐蚀,与开运算相反可以填充白色物体内细小黑色空洞的区域、连接临近物体等。Python实现可以利用cv2.erode()函数和cv2.dilate()函数来实现开运算与闭运算OpenCV提供cv2.morphologyEx()实现开运算与闭运算。openimg=cv.morphologyEx(image,cv.MORPH_OPEN,k)closeimg=cv.morphologyEx(image,cv.MORPH_CLOSE,k)
op参数设置为cv2.MORPH_OPEN:开运算cv2.MORPH_CLOSE时:闭运算importcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/aaa.jpg")#读取一幅图像k=np.ones((10,10),np.uint8)#构建10×10的矩形结构元openimg=cv.morphologyEx(image,cv.MORPH_OPEN,k)#设置参数,实现图像的开运算cv.imshow("image",image)#显示原始图像cv.imshow("openimg",openimg)#显示开运算图像cv.waitKey()cv.destroyAllWindows()a为原始图像;b为对a进行开运算的结果。可以看出,图像的毛边被消除了。【例
5】用cv2.erode()函数和cv2.dilate()函数来实现图像的开运算importcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/aaa.jpg")#读取一幅图像k=np.ones((10,10),np.uint8)#构建10×10的结构元erod_n=cv.erode(image,k)#实现图像的腐蚀操作dilate_n=cv.dilate(erod_n,k)#实现图像的膨胀操作cv.imshow("image",image)#显示原始图像cv.imshow("image",image)#显示原始图像cv.imshow("open",dilate_n)#显示经过先腐蚀后膨胀的图像cv.waitKey()cv.destroyAllWindows()a为原始图像,b为对a进行先腐蚀后膨胀的结果。可以看出,先腐蚀后膨胀的结果与开运算的结果基本一样。2.闭运算演示【例
6】用cv2.morphologyEx()函数实现图像的闭运算importcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/love.png")#读取一幅图像k=np.ones((10,10),np.uint8)#构建10×10的矩形结构元closeimg=cv.morphologyEx(image,cv.MORPH_CLOSE,k)#设置参数,实现图像的闭运算cv.imshow("image",image)#显示原始图像cv.imshow("closeimg",closeimg)#显示开运算图像cv.waitKey()cv.destroyAllWindows()a原始图像,b为对a进行闭运算的结果。可以看出,前景图像的黑点被消除了。【例7】用cv2.erode()函数和cv2.dilate()函数来实现图像的闭运算importcv2ascimportnumpyasnpimage=cv.imread("F:/picture/love.png")#读取一幅图像k=np.ones((10,10),np.uint8)#构建10×10的结构元dilate_n=cv.dilate(image,k)#实现图像的膨胀操作erod_n=cv.erode(dilate_n,k)#实现图像的腐蚀操作cv.imshow("image",image)#显示原始图像cv.imshow("close",erod_n)#显示经过先膨胀后腐蚀的图像cv.waitKey()cv.destroyAllWindows()a为原始图像,b为对a进行先膨胀后腐蚀的结果。可以看出,先膨胀后腐蚀的结果与闭运算的结果基本上一样8.5形态学梯度运算理论基础梯度运算是利用图像的膨胀图像减去腐蚀图像的一种形态学操作,这种操作可以获得图像的边缘信息。形态学梯度的定义:函数说明dst=cv2.morphologyEx(src,op,k[,anchor[,iterations[,boderType[,boderValue]]]])dst:表示返回梯度运算的结果。src:表示原始图像。op:表示操作类型,当设置为cv2.MORPH_GRADIENT时,表示对图像进行梯度运算。参数k、anchor、iterations、boderType和boderValue与cv2.dilate()函数的参数用法一致。效果展示(a)是原始图像;(b)是结构元k=2×2的梯度运算结果;(c)是结构元k=5×5的梯度运算结果,随着结构元k的增大,扫描到的边缘会越来越粗,以至于无法分辨出边缘。图8-21形态学梯度运算利用图像的膨胀图像减去腐蚀图像的一种形态学操作,可以获得图像的边缘信息。梯度运算的过程就是膨胀结果减去腐蚀结果。梯度运算---小结Python实现dst=cv2.morphologyEx(src,op,k[,anchor[,iterations[,boderType[,boderValue]]]])dst表示返回梯度运算的结果。src表示原始图像。op表示操作类型,当设置为cv2.MORPH_GRADIENT时,表示对图像进行梯度运算。参数k、anchor、iterations、boderType和boderValue与cv2.dilate()函数的参数用法一致。importcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/contours.png")#读取一幅图像k1=np.ones((2,2),np.uint8)
#构建一个2×2的结构元k2=np.ones((5,5),np.uint8)#构建一个5×5的结构元r1=cv.morphologyEx(image,cv.MORPH_GRADIENT,k1)#实现图像的梯度运算r2=cv.morphologyEx(image,cv.MORPH_GRADIENT,k2)#实现图像的梯度运算cv.imshow("image",image)#显示原图cv.imshow("r1",r1)#显示梯度运算后的结果图cv.imshow("r2",r2)#显示梯度运算后的结果图cv.waitKey()cv.destroyAllWindows()a是原始图像;b是结构元k=2*2的梯度运算结果;c是结构元k=5*5的梯度运算结果。随着结构元k的增大,扫描到的边缘会越来越粗,以至于无法分辨出边缘。8.6黑帽与礼帽运算理论基础黑帽与礼帽运算建立在开运算与闭运算的基础上。(1)黑帽运算黑帽运算是用原始图像减去闭运算的结果,即它可以获得比原始图像边缘更加黑暗的边缘部分,或者获得图像内部的小孔。(2)礼帽运算礼帽运算是用原始图像减去开运算的结果,即它可以获得图像的噪声信息或者比原始图像边缘更亮的边缘部分。函数说明在OpenCV中提供了比较方便的函数cv2.morphologyEx()来直接实现图像的黑帽运算与礼帽运算。当将op参数设置为cv2.MORPH_BLACKHAT和cv2.MORPH_TOPHAT时,可以对图像进行黑帽运算与礼帽运算的操作。黑帽运算效果展示图8-22黑帽运算(b)为对图8-22(a)进行黑帽运算的结果。可以看出,黑帽运算可以将目标内部暗的部分提取出来。礼帽运算效果展示图8-33礼帽运算(b)为对图8-23(a)进行礼帽运算的结果。可以看出,礼帽运算可以将目标边缘部分提取出来。黑帽与礼帽运算建立在开运算与闭运算的基础上。1.黑帽运算:原始图像—闭运算
可以获得比原始图像边缘更加黑暗的边缘部分,或者获得图像内部的小孔。2.礼帽运算:原始图像—图像开运算可以获得图像的噪声信息或者比原始图像边缘更亮的边缘部分。黑帽与礼帽运算---小结Python实现cv2.morphologyEx()来直接实现图像的黑帽运算与礼帽运算。当将op参数设置为openimg=cv.morphologyEx(image,cv.MORPH_OPEN,k)closeimg=cv.morphologyEx(image,cv.MORPH_CLOSE,k)
op参数设置为cv2.MORPH_OPEN:开运算cv2.MORPH_CLOSE时:闭运算cv2.MORPH_BLACKHAT:黑帽运算cv2.MORPH_TOPHAT时:礼帽运算的操作。importcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/love.png")#读取一幅图像k=np.ones((10,10),np.uint8)#构建10×10的矩形结构元bhimg=cv.morphologyEx(image,cv.MORPH_BLACKHAT,k)#设置参数,实现图像的黑帽运算cv.imshow("image",image)#显示原始图像cv.imshow("bhimg",bhimg)#显示黑帽运算图像cv.waitKey()cv.destroyAllWindows()a为原始图像,b为对a进行黑帽运算的结果。可以看出,黑帽运算可以将图像内部和边缘中比原始图像暗的部分提取出来。【例
9】
用cv2.morphologyEx()函数实现图像的礼帽运算importcv2ascvimportcv2ascvimportnumpyasnpimage=cv.imread("F:/picture/love.png")
#读取一幅图像k=np.ones((10,10),np.uint8)#构建10×10的矩形结构元bhimg=cv.morphologyEx(image,cv.MORPH_TOPHAT,k)#设置参数,实现图像的礼帽运算cv.imshow("image",image)#显示原始图像cv.imshow("bhimg",bhimg)#显示礼帽运算图像cv.waitKey()cv.destroyAllWindows()a为原始图像,b为对a进行礼帽运算的结果。可以看出,礼帽运算可以将图像内部和边缘中比原始图像亮的部分提取出来。8.7图像细化细化技术:把一个平面区域简化成图的结构形状表示法。骨架:一种细化结构,它是目标的重要拓扑描述,具有非常广泛的应用。在图像识别或数据压缩时,经常用细化结构,例如,在识别字符之前,往往要先对字符作细化处理,求出字符的细化结构。8.5图像细化细化:目的是将图像的骨架提取出来的同时,保持图像细小部分的连通性,特别是在文字识别,地质识别,工业零件识别或图像理解中,先对被处理的图像进行细化有助于突出形状特点和减少冗余信息量。细化细化技术:把一个平面区域简化成图的结构形状表示法。骨架:一种细化结构,它是目标的重要拓扑描述,具有非常广泛的应用。在图像识别或数据压缩时,经常用细化结构,例如,在识别字符之前,往往要先对字符作细化处理,求出字符的细化结构。骨架抽取细化过程:求一图像骨架的过程。骨架:重要拓扑描述,指骨骼部分。长方形骨架:长方向上的中轴线;正方形骨架:中心点;圆骨架:圆心;直线骨架:自身;孤立点骨架:自身。细化细化细化算法:采取逐次去除边界的方法来进行的,不能破坏图像的连通性。在细化一幅图像X时应满足两个条件:第一,在细化的过程中,X应该有规律地缩小;第二,在X逐步缩小的过程中,应当使X的连通性质保持不变。细化实际应用:通常选择一组结构元素对,不断在这些结构对中循环,如果所得结果不再变化,则终止迭代过程,随着迭代的进行,集合也不断细化。结构对的选择:仅受结构元素不相交的限制。事实上,每一个Bi(i=1,2,…,N)都可以是相同的结构对,即在不断重复的迭代细化过程使用同一个结构对。。细化设置一个5*5的邻域S模板;S模板中各个位置上的取值取决于模板所对应图像中不同位置的像素,如果S模板某一个位置上所对应的像素值为白,模板上该位置赋为0,否则赋为1。细化s[0][0]s[0][1]s[0][2]s[0][3]s[0][4]s[1][0]s[1][1]s[1][2]s[1][3]s[1][4]s[2][0]s[2][1]s[2][2]s[2][3]s[2][4]s[3][0]s[3][1]s[3][2]s[3][3]s[3][4]s[4][0]s[4][1]s[4][2]s[4][3]s[4][4]N(s[2][2])表示以s[2][2]为中心的3×3邻域内目标像素(即黑点)的个数。取其中的3×3邻域以s[2][2]为中心点,则T(s[2][2])表示序列:s[1][2]-》s[1][2]0->1的变化次数。取其中的3×3邻域以s[1][2]为中心点,则T(s[1][2])表示序列:s[0][2]-》s[0][2]0->1的变化次数。取其中的3×3邻域以s[2][1]为中心点,则T(s[2][1])表示序列:s[1][1]-》s[1][1]0->1的变化次数。细化条件1:2≦N(s[2][2])≦6;条件2:T(s[2][2]))=1;条件3:s[1][2]*s[2][1]*s[2][3]=0同时T(s[1][2])!=1;条件4:s[1][2]*s[2][1]*s[3][2]=0同时T(s[2][1])!=1。同时满足以上4个条件,则删除该点,否则保留,重复判断像素点直至没有点可以删除。细化细化过程就是判断每一个二值化的图像像素点是否满足以上4个条件,满足则删除该点,重复判断直至所有点都不能删除为止。细化(1)获得原图像的首地址及图像的高和宽。(2)开辟一块内存缓冲区,并初始化为255。(3)如果当前像素为白,是背景则跳过该像素。(4)如果当前像素为黑,是物体,则定义一个5×5的结构元素,计算5×5的结构元素中各个位置上的值,将S模板中心覆盖在欲判断的像素上,如果S模板所覆盖的位置下,像素值为白,则置0,否则置1。(5)依次判断S模板点是否同时满足4个判断条件,是则删除该点,否则判断下一个像素点,直至所有的像素点处理完一遍。(6)循环执行5直至没有点可以删除为止。实现步骤效果图小结对图像细化的过程实际上是求图像骨架的过程。在细化一幅图像X的过程中应满足两个条件:第一,在细化的过程中,X应该有规律地缩小;第二,第二,在X逐步缩小的过程中,应当使X的连通性质保持不变。每幅小图的中心点不能删设置一个5×5的邻域S模板,如果S模板某一个位置上所对应的像素值为白,模板上该位置赋为0,否则赋为1。小结(1)N(s[2][2])表示以s[2][2]为中心的3×3邻域内目标像素点(即黑点)的个数,取其中的3×3邻域以s[2][2]为中心点,则T(s[2][2])表示序列:s[1][2],s[1][1],s[2][1],s[3][1],s[3][2],s[3][3],s[2][3],s[1][3],s[1][2]中0→1的变化次数。(2)取其中的3×3邻域以s[1][2]为中心点,则T(s[1][2])表示序列:s[0][2],s[0][1],s[1][1],s[2][1],s[2][2],s[2][3],s[1][3],s[0][3],s[0][2]中0→1的变化次数。(3)取其中的3×3邻域以s[2][1]为中心点,则T(s[2][1])表示序列:s[1][1],s[1][0],s[2][0],s[3][0],s[3][1],s[3][2],s[2][2],s[1][2],s[1][1]中0→1的变化次数。小结4个条件来判断像素点是否可以删除,当像素点同时满足这4个条件时,这个点就可以删除。条件1:2≤N(s[2][2])≤6;条件2:T(s[2][2]))=1;条件3:s[1][2]*s[2][1]*s[2][3]=0同时T(s[1][2])!=1;条件4:s[1][2]*s[2][1]*s[3][2]=0同时T(s[2][1])!=1。效果展示作者杨淑莹敬上谢谢!第9章图像分割与测量9.1概述图像分析过程图像图像识别图像预处理图像理解图像分割图像分割与测量是图像识别工作的基础。图像分割将图像分为一些有意义的区域,然后可以对这些区域进行描述,相当于提取出某些目标区域图像的特征,判断图像中是否有感兴趣的目标。图像分割的基础是像素间的相似性和跳变性。图像分割的概念分成若干个互不相交的小区域的过程,小区域是某种意义下具有共同属性的像素的连通集合。各区域对某种性质,如灰度,纹理等有相似性。区域内部是连通的,没有过多小孔。区域边界是明确的,相邻区域对分割所依据的性质有明显的差异。图像分割的概念图像分割图像分割:把图像分成各具特性的区域,如目标或前景与背景,选择性地定位感兴趣目标在图像中的位置和范围,提取出感兴趣目标的技术和过程。
人的视觉系统对图像分割是十分复杂的,也是相当有效的。但分割原理和模型都未搞清楚。图像分割的基本思路:从简到难,逐级分割控制背景环境,降低分割难度把焦点放在增强感兴趣对象,缩小不相干图像成分的干扰上。图像分割边缘检测:检测出边缘,再将边缘像素连接,构成边界形成分割,找出目标物体的轮廓,进行目标的分析、识别、测量等。阈值分割:最常用法。有直方图门限选择,半阈值选择图像分割,迭代阈值。边界方法:直接确定区域边界,实现分割;有边界跟踪法,轮廓提取法。区域法:将各像素划归到相应物体或区域的像素聚类方法;有区域增长法等。图像分割四种不同的方法概述分割的目的是将图像分为一些有意义的区域,如目标或前景,然后可以对这些区域进行描述。图像分割的基本思路:从简到难,逐级分割;控制背景环境,降低分割难度,把焦点放在增强感兴趣的对象,缩小不相干图像成分的干扰上。图像分割的方法有多种,依据工作对像来分,可分为点相关分割和区域相关分割;按算法分类,可分为阀值法,界限检测法,匹配法,跟踪法等。9.2阈值法分割154基本原理原始图像——f(x,y)灰度阈值——T阈值运算得二值图像——g(x,y)阈值分割9.2.1直方图门限选择法9.2.1直方图阈值选择
阈值T可通过分析边缘检测输出的直方图来确定。假设,一幅图像只有物体和背景两部分组成,其灰度级直方图成明显的双峰值。255f(i,j)158人工阈值人工选择法是通过人眼的观察,应用人对图像的知识,在分析图像直方图的基础上,人工选出合适的阈值。也可以在人工选出阈值后,根据分割效果,不断的交互操作,从而选择出最佳的阈值。159直方图阈值选择阈值选择直接影响分割效果,利用灰度直方图求两峰之间的谷底作为阈值。160T=70的二值化图像原始图像直方图人工阈值255如果f(i,j)≥Tf(i,j)=
0如果f(i,j)<T或:
0如果f(i,j)≥Tf(i,j)=
255如果f(i,j)<T直方图阈值选择
若直方图呈现多个明显的峰值,如三个峰值,可取两个峰谷处的灰度值T1,T2作为阈值。同样,可将阈值化后的图像变成二值化图像。
f(i,j)T1T22550直方图阈值选择其数学表达式为:
0如果T1≤f(i,j)≤T2f(i,j)=
255其它或
255如果T1≤f(i,j)≤T2f(i,j)=
0其它
直方图阈值选择1)获得原图像的首地址,图像的宽和高。2)开辟一块内存空间,初始化为255。3)图像灰度统计,显示灰度直方图。4)通过对话框选取一个峰谷作为阈值。5)像素灰度值小于阈值,将像素置为0,否则置为255。6)将结果复制到原图像数据区。实现步骤效果图(a)根据直方图选择阈值(b)原图(c)二值化效果展示根据直方图9-3所示,将两峰之间的谷底140作为阈值。
图9-3直方图19.2.2半阈值选择法9.2.2半阈值选择分割不论图像的直方图具有双峰还是多峰值,阈值化后将原多值图像变成二值图像,若希望只把图像的背景表示成二值图像(即背景不是最白就是最黑),而物体为多值图像。此时,可采用半阈值技术,把物体从背景中分离出来。半阈值化表示为:
f(i,j)如果f(i,j)≥Tf(i,j)=
0或者255如果f(i,j)<T
或
f(i,j)如果f(i,j)≤Tf(i,j)=
0或者255其它半阈值选择分割1)获得原图像的首地址,图像的宽和高。2)开辟一块内存空间,并初始化为255。3)进行图像灰度统计,显示灰度直方图。4)选取一个峰谷作为阈值。5)像素灰度值小于阈值,将像素置为0,否则保持灰度值不变。实现步骤(a)根据直方图选择阈值
(b)半阈值选择分割效果图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迭代阈值法176基本思想:选择一个阈值作为初始值,按某种策略不断地迭代改进,直到满足给定的准则。自动输出一个阈值。在迭代过程中,关键是阈值改进策略,阈值改进策略要求:快速收敛,新产生阈值优于上一次的阈值。9.2.3迭代阈值分割迭代阈值法
1)选择图像灰度的中值作为初始阈值Ti=T0。2)利用阈值Ti把图像分割成两部分区域,R1和R2,并计算其灰度均值。3)计算新的阈值Ti+14)重复步骤2、3,直到Ti+1和Ti的阈值差别小于某个给定值。1)获得原图像的首地址,图像的高和宽。2)进行直方图统计。3)设定初始阈值T=127。4)分别计算图像中小于T和大于T的两组平均灰度值。5)迭代计算阈值,直至两个阈值相等。7)根据计算出的阈值,对图像进行二值化处理。实现步骤179原始图像迭代阈值二值化效果图函数说明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*μ1(9-12)
g=ω0(μ0-μ)^2+ω1(μ1-μ)^2(9-13)
将式(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分水岭算法是一种分割方法;在分割中,与邻近相似性作为参考依据;将空间位置上相近和灰度值相近的像素点,连接起来构成一个封闭的轮廓;比喻为地理学上的地形表面实现分割。9.1分水岭算法9.1.1算法原理灰度值高的区域看成山峰,灰度值低的区域看成山谷。由于噪声,存在过度分割的现象;为了解决过度分割的问题,使用基于标记(mark)图像的分水岭算法。通常的mark图像都是在某个区域定义了一些灰度层级,在这个区域的洪水淹没过程中,水平面都是从定义的高度开始的,这样可以避免一些很小的噪声极值区域的分割。9.1.2OpenCV中的相关函数完成分水岭分割还需要:对灰度图进行OTSU二值化阈值处理;形态学函数;距离变换函数cv2.distanceTransform();计算结果进行阈值化处理,得到图像内子图的一些形状信息;对目标进行标注,函数cv2.connectedComponent()使用cv2.watershed()函数实现分水岭算法。1.形态学函数开运算:先腐蚀后膨胀的操作。去除图像内的噪声。在用分水岭算法处理图像前,要先使用开运算去除图像内的噪声,以避免噪声对图像分割可能造成的干扰。2.距离变换函数distanceTransform二值图像内任意点到最近背景点的距离。一般计算非零值像素点到最近的零值像素点的距离。其计算结果反映了各个像素与背景(值为0的像素点)的距离关系。如果对上述计算结果进行阈值化处理,就可以得到图像内子图的一些形状信息。距离变换函数实现步骤①将输入图片转换为二值图像,前景设置为1,背景设置为0②先遍历图像:左,左上,上,左下公式计算:D表示距离包括欧式距离,棋盘距离和麦哈顿距离;掩膜模板mask为maskL;f(p)为像素点p的像素值;③再次遍历图像,右,右上,右下,下;④根据模板maskL和maskR的扫描,得到最终的距离变换图像。为了减少计算了量,采用了一种倒角模版的算法,只需要对图像进行两次扫描,可以实现距离变换,该方法被称为chamfer倒角距离变换,该模版如下:距离变换函数实现步骤函数介绍dst=cv2.distanceTransform(src,distanceType,maskSize[,dstType])·dst表示计算得到目标函数图像。·src表示原始图像,必须是8通道的二值图像。·distanceType表示距离类型。·maskSize表示掩模的尺寸大小。·dstType表示目标函数的类型,默认为CV_F。distanceType表示的是选取距离的类型,可以设置为CV_DIST_L1,CV_DIST_L2,CV_DIST_C等,具体如下:DIST_L1=1,distance=|x1-x2|+|y1-y2|DIST_L2=2,thesimple欧式distanceDIST_C=3,distance=max(|x1-x2|,|y1-y2|)DIST_L12=4,L1-L2metric:distance=2(sqrt(1+x*x/2)-1))DIST_FAIR=5,distance=c^2(|x|/c-log(1+|x|/c)),c=1.3998DIST_WELSCH=6,distance=c^2/2(1-exp(-(x/c)^2)),c=2.9846DIST_HUBER=7distance=|x|<c?x^2/2:c(|x|-c/2),c=1.345maskSize表示的是距离变换的掩膜模板,可以设置为3,5或CV_DIST_MASK_PRECISE,对CV_DIST_L1或CV_DIST_C的情况,参数值被强制设定为3,因为3×3mask给出5×5mask一样的结果,而且速度还更快。labels表示可选输出2维数组;labelType表示的是输出二维数组的类型;defcalcEuclideanDistance(x1,y1,x2,y2): returnmath.sqrt(float((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));defdistanceTrans(src,x1):rows=src.shape[0]cols=src.shape[1]#第一遍遍历图像,使用左模板foriinrange(1,rows-1):forjinrange(1,cols-1):ifi==x1:disPara=calcEuclideanDistance(i,j,i,j-1)fDisMin=min(float(src[i][j]),src[i][j-1]+disPara)disPara=calcEuclideanDistance(i,j,i-1,j-1)fDisMin=min(fDisMin,src[i-1][j-1]+disPara)disPara=calcEuclideanDistance(i,j,i-1,j)fDisMin=min(fDisMin,src[i-1][j]+disPara)disPara=calcEuclideanDistance(i,j,i-1,j+1)fDisMin=min(fDisMin,src[i-1][j+1]+disPara)src[i][j]=fDisMin
#第二遍使用右模板,从右下角开始foriinrange(rows-2,0,-1):forjinrange(cols-2,0,-1):ifi==x1:disPara=calcEuclideanDistance(i,j,i,j+1)fDisMin=min(float(src[i][j]),src[i][j+1]+disPara)disPara=calcEuclideanDistance(i,j,i+1,j+1)fDisMin=min(fDisMin,src[i+1][j+1]+disPara)disPara=calcEuclideanDistance(i,j,i+1,j)
fDisMin=min(fDisMin,src[i+1][j]+disPara)disPara=calcEuclideanDistance(i,j,i+1,j-1)fDisMin=min(fDisMin,src[i+1][j-1]+disPara)src[i][j]=fDisMinreturnsrc[[000000][02552552552550][02552552552550][02552552552550][02552552552550][000000]][[000000][011110][02552552552550][02552552552550][02552552552550][000000]][[000000][011110][012210][02552552552550][02552552552550][000000]][[000000][011110][012210][012210][02552552552550][000000]]9-1-0观察距离变换函数cv2.distanceTransform()
[[000000][011110][012210][012210][011110][000000]]1.原图2.第一行距离3.第二行距离4.第三行距离5.第四行距离img=cv2.imread("F:/picture/coin.jpg")imageGray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)#对灰度图进行OTSU阈值处理ret,thresh=cv.threshold(imageGray,0,255,cv.THRESH_BINARY_INV+cv.THRESH_OTSU)kernel=np.ones((3,3),np.uint8)#设定开运算的卷积核#对二值图像进行开运算imageOpen=cv.morphologyEx(thresh,cv.MORPH_OPEN,kernel,iterations=2)distTransform=cv.distanceTransform(im
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广西南宁市武鸣区2025年英语八下期中预测试题含答案
- 8.6.2 直线与平面垂直的判定1课时-2025年高一数学新教材同步课堂精讲练导学案(人教A版2019必修第二册)含答案
- 2025年城市天然气供应协议
- 2025年协作承包协议模板
- 2025年吉林长春商业地产租赁协议书策划范本
- 2025年企业电脑租赁策划合作框架协议
- 粮食生产与储备的智能化综合调度系统
- 物联网在粮食储备管理中的应用探索
- 推动非遗保护传承未来展望及发展趋势
- 探索医体融合的背景意义及必要性
- 外研版四年级英语下册(一年级起点)全册完整课件
- 电厂锅炉炉膛内脚手架施工方案
- 木家具制造工艺学-南京林业大学中国大学mooc课后章节答案期末考试题库2023年
- 大数据与法律检索-湖南师范大学中国大学mooc课后章节答案期末考试题库2023年
- 天然气安全技术说明书MSDS
- 老旧住宅屋面防水工程施工方案
- 内科-心内简答题(干货分享)
- 《MTP-中层管理技能提升训练》课件
- 《抖音平台商品销售策略研究10000字(论文)》
- 会议记录(空白)
- GB/T 24338.5-2018轨道交通电磁兼容第4部分:信号和通信设备的发射与抗扰度
评论
0/150
提交评论