opencv形态学操作 腐蚀 膨胀 通用形态学函数

腐蚀

img=np.zeros((5,5),np.uint8)
img[1:4,1:4]=1
kernel=np.ones((3,1),np.uint8)
erosion=cv2.erode(img,kernel)
print("img=\n",img)
print("kernel=\n",kernel)
print("erosion=\n",erosion)

img=
[[0 0 0 0 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 0 0 0 0]]
kernel=
[[1]
[1]
[1]]
erosion=
[[0 0 0 0 0]
[0 0 0 0 0]
[0 1 1 1 0]
[0 0 0 0 0]
[0 0 0 0 0]]

img = cv2.imread("erode.png")
#img2 = cv2.medianBlur(img,5)
kernel = np.ones((2,2),np.uint8)
img2 = cv2.erode(img,kernel,iterations=5)
#

cv2.imshow("i",img2)
cv2.imshow("i1",img)

iterations=5:迭代五次
在这里插入图片描述
迭代次数为1时:
在这里插入图片描述
毛刺还没有腐蚀掉。

膨胀

膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。如果图像内两个对象的距离较近,那么在膨胀的过程中,两个对象可能会连通在一起。膨胀操作对填补图像分割后图像内所存在的空白相当有帮助。
只要当核kernel的任意一点处于前景图像中时,就将当前中心点所对应的膨胀结果图像内像素点的值置为1。

开运算

先腐蚀,再膨胀,可以用于去噪 计数

img = cv2.imread("erode.png")
#img2 = cv2.medianBlur(img,5)
kernel = np.ones((3,3),np.uint8)
r1 = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
cv2.imshow("i",r1)
cv2.imshow("i1",img)
cv2.waitKey()

在这里插入图片描述

闭运算

闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。
closing=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

形态学梯度运算

形态学梯度运算是用图像的膨胀图像减腐蚀图像的操作,该操作可以获取原始图像中前景图像的边缘。 形态学梯度运算使用膨胀图像(扩张亮度)减腐蚀图像(收缩亮度),得到原始图像中前景对象的边缘。

img = cv2.imread("erode.png")
#img2 = cv2.medianBlur(img,5)
kernel = np.ones((5,5),np.uint8)
r1 = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
cv2.imshow("i",r1)
cv2.imshow("i1",img)

cv2.waitKey()

在这里插入图片描述

礼帽运算

可获取图像噪声信息

img = cv2.imread("erode.png")
#img2 = cv2.medianBlur(img,5)
kernel = np.ones((5,5),np.uint8)
r1 = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
cv2.imshow("i",r1)
cv2.imshow("i1",img)

在这里插入图片描述

核函数

例使用函数cv2.getStructuringElement()生成不同结构的核。 根据题目要求,编写程序如下:

kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))
kernel2 = cv2.getStructuringElement(cv2.MORPH_CROSS,(5, 5))
kernel3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5, 5))

print("kernel1=\n", kernel1)
print("kernel2=\n", kernel2)
print("kernel3=\n", kernel3)

kernel1=
[[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]]
kernel2=
[[0 0 1 0 0]
[0 0 1 0 0]
[1 1 1 1 1]
[0 0 1 0 0]
[0 0 1 0 0]]
kernel3=
[[0 0 1 0 0]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[0 0 1 0 0]]
用不同的核做膨胀运算:

r1 = cv2.dilate(img,kernel1)

猜你喜欢

转载自blog.csdn.net/qq_41358574/article/details/114192815