OpenCV-python学习笔记(八)——形态学操作

八、形态学操作

形态学:处理图像形状特征的图像技术

利用一种特殊的结构元(本质上就是卷积核)来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。

基本操作有:俯视、膨胀、开运算、闭运算、形态学梯度运算、顶帽运算、黑猫运算。

8.1 腐蚀

边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除

腐蚀用来 “收缩"或者“细化" 二值图像中的前景,借此实现去除噪声、元素分割等功能

使用结构元逐个像素扫描要被腐蚀的图像,根据结构元和被腐蚀图像的关系来确定腐蚀结果图像中对应结构元中心点位置的像素点的值

每次判定的点都是与中心点所对应的点。

如果结构元完全处于前景图像中,就将结构元中心点所对应的腐蚀结果图像中的像素点处理为前景色

如果结构元未完全处于前景图像中,就将结构元中心点对应的腐蚀结果图像中的像素点处理为背景色

dst=cv2.erode (src,kernel[,anchor[,iterations[,borderType[,borderValue]]]])

kernel: 腐蚀操作时所采用的结构类型,可自定义生成。

anchor: element结构中锚点的位置,默认(-1.-1),在核的中心位置。

iterations: 腐蚀操作迭代次数,默认一次。

borderType: 边界样式,默认值BORDER_CONSTANT

示例: 用一个5×5的核去腐蚀原始图像的毛刺,迭代一次

import cv2
import numpy as np
o=cv2.imread ("erode.png",cv2.IMREAD_UNCHANGED)
kernel=np.ones ((5,5) ,np.uint8)
erosion=cv2.erode (o,kernel) 	#迭代5次,erosion=cv2.erode (o,kernel,iterations=5)
cv2.imshow ("orriginal",o)
cv2.imshow ("erosion",erosion)
cv2.waitKey ()
cv2.destroyAllWindows ()

结果:
在这里插入图片描述

8.2 膨胀

对图像边界进行扩张

如果结构元中任意一点处于前景图像,就将膨胀结果图像中对应像素点处理为前景色

如果结构元完全处于背景图像,就将膨胀结果图像中对应像素点处理为背景色。

dst=cv2.dilate (src,kernel[,anchor[,iterations[,borderType[,borderValue]]]])

参数与腐蚀的一样

示例:使用9×9的核,对原始图像进行膨胀

import cv2
import numpy as np
o=cv2.imread ("dilation.png",cv2.IMREAD_UNCHANGED)
kernel=np.ones ( (9,9) ,np.uint8 )
dilation=cv2.dilate (o,kernel)
cv2.imshow ( "original",o)
cv2.imshow ("dilation",dilation)
cv2.waitKey ()
cv2.destroyAllWindows ()

结果:
在这里插入图片描述

8.3 通用形态学函数

dst=cv2.morphologyEx(src,op,kernel[,anchor[,iterations[,borderType[,borderValue]]]])

op: 操作类型,形态学运算的操作规则均由腐蚀和膨胀操作组合而成
在这里插入图片描述

8.4 开运算

先将图像腐蚀,再对腐蚀结果进行膨胀,可以用于去噪或者计数等。

opening=cv2.morphologyEx ( img,cv2.MORPH_OPEN,kernel)

kernel: 腐蚀操作时所采用的结构类型,可自定义生成。

示例:

import cv2
import numpy as np
img1=cv2.imread ("erode.png")
k=np.ones ( (10,10) ,np.uint8)
r1=cv2.morphologyEx (img1,cv2.MORPH_OPEN,k)
cv2.imshow ( "img 1",img1)
cv2.imshow ( "result1",r1)
cv2.waitKey ()
cv2.destroyAllWindows ()

结果:
在这里插入图片描述

8.5 闭运算

先膨胀后腐蚀,有助于关闭前景物体内部的小孔,或去除物体上的小黑点。闭运算还可以实现前景图像的连接。

closing=cv2.morphologyEx ( img,cv2.MORPH_CLOSE,kernel)

示例:进行连接和去噪

import cv2
import numpy as np
img1=cv2.imread ( "closing.png")
img2=cv2.imread ("close.png")
k=np.ones ((9,9),np.uint8)
r1=cv2.morphologyEx (img1,cv2.MORPH_CLOSE,k,iterations=1)
r2=cv2.morphologyEx (img2,cv2.MORPH_CLOSE,k,iterations=5)
cv2.imshow ("img1",img1)
cv2.imshow ("result1",r1)
cv2.imshow ("img2",img2)
cv2.imshow ("result2",r2)
cv2.waitKey ()
cv2.destroyAllWindows ()

结果:
在这里插入图片描述

8.6 形态学梯度运算

膨胀图像减腐蚀图像,此运算可以获得原始图像前景图像的边缘

result=cv2.morphologyEx (img,cv2.MORPH_GRADIENT,kernel)

示例:

import cv2
import numpy as np
o=cv2.imread ( "j.png",cv2.IMREAD_UNCHANGED)
k=np.ones ((5,5) ,np.uint8)
r=cv2.morphologyEx (o,cv2.MORPH_GRADIENT,k)
cv2.imshow ( "original",o)
cv2.imshow ("result",r )
cv2.waitKey ()

结果:
在这里插入图片描述

8.7 礼貌运算

原始图像减去开运算图像,礼貌运算可以获取噪声信息,或者得到比原始图像的边缘更亮边缘信息

result=cv2.morphologyEx ( img,cv2.MORPH_TOPHAT,kernel)

示例:

import cv2
import numpy as np
o1=cv2.imread ("lena.png",cv2.IMREAD_UNCHANGED)
o2=cv2.imread ("erode.png",cv2.IMREAD_UNCHANGED)
k=np.ones ((5,5) ,np.uint8)
r1=cv2.morphologyEx (o1,cv2.MORPH_TOPHAT,k)
r2=cv2.morphologyEx (o2,cv2.MORPH_TOPHAT,k)
cv2.imshow ("original1",o1)
cv2.imshow ("original2",o2)
cv2.imshow ("result1",r1)
cv2.imshow ("result2",r2)
cv2.waitKey ()
cv2.destroyAllWindows ()

结果:
在这里插入图片描述
在这里插入图片描述

8.8 黑帽运算

闭运算图像减去原始图像,能获取图像内部的小孔,或者前景色中的小黑点,或者得到比原始图像的边缘更暗的边缘部分。

result=cv2.morphologyEx ( img,cv2.MORPH_BLACKHAT,kernel)

示例:

import cv2
import numpy as np
o1=cv2.imread ("closing.png",cv2.IMREAD_UNCHANGED)
o2=cv2.imread ("lena.png",cv2.IMREAD_UNCHANGED)
k=np.ones ( (5,5) ,np.uint8)
r1=cv2.morphologyEx (o1,cv2.MORPH_BLACKHAT,k)
r2=cv2.morphologyEx (o2,cv2.MORPH_BLACKHAT,k)
cv2.imshow ("original1",o1)
cv2.imshow ("original2",o2)
cv2.imshow ("result 1",r1)
cv2.imshow ("result2",r2)
cv2.waitKey ()
cv2.destroyAllWindows ()

结果:
在这里插入图片描述

8.9 核函数

用于形态学操作的指定大小和形状的结构元素。

retval=cv2.getStructuringElement (shape,ksize[,anchor])
类型 说明
cv2.MORPH_RECT 矩形结构元素,所有元素值都是1
cv2.MORPH_CROSS 十字形结构元素,对角线元素值1
cv2.MORPH_ELLIPSE 椭圆形结构元素

ksize: 结构元素大小

anchor: 锚点位置,默认点(-1,-1)

示例:不同的核对形态学操作的影响

import cv2
o=cv2.imread ("kernel.png",cv2.IMREAD_UNCHANGED)
kernel1=cv2.getStructuringElement (cv2.MORPH_RECT,(59,59))    //矩形
kernel2=cv2.getStructuringElement (cv2.MORPH_CROSS,(59,59))	  //十字形
kernel3=cv2.getStructuringElement (cv2.MORPH_ELLIPSE,(59,59)) //椭圆
dst1 =cv2.dilate (o,kernel1)
dst2=cv2.dilate (o,kernel2)
dst3=cv2.dilate (o,kernel3)
cv2.imshow ( "orriginal",o)
cv2.imshow ("dst1",dst1)
cv2.imshow ("dst2",dst2)
cv2.imshow ("dst3",dst3)
cv2.waitKey ()
cv2.destroyAllWindows ()

结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_56321457/article/details/125992149