Opencv之形态学操作

最基础的形态学操作即腐蚀操作和膨胀操作,在此基础之上,又出现了开运算、闭运算、梯度运算、礼帽与黑帽操作。所有的形态学操作只针对二值图片。

腐蚀操作

首先,读入一张二值图片。

pie = cv2.imread('pie.png')

cv2.imshow('pie', pie)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
腐蚀操作的原理就是求局部最小值的操作,核与图形卷积,即计算核覆盖的区域(体现局部)的像素点的最小值,并把这个最小值赋值给参考点指定的像素。这样就会使图像中的高亮区域逐渐减少。

# 定义一个30*30的核
kernel = np.ones((30,30),np.uint8) 
# 腐蚀操作
erosion_1 = cv2.erode(pie,kernel,iterations = 1) # iteration指进行腐蚀操作的次数
erosion_2 = cv2.erode(pie,kernel,iterations = 2)
erosion_3 = cv2.erode(pie,kernel,iterations = 3)
# 展示结果
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

膨胀操作

与腐蚀相反,膨胀就是求局部最大值的操作,核与图形卷积,即计算核覆盖的区域(体现局部)的像素点的最大值,并把这个最大值赋值给参考点指定的像素。这样就会使图像中的高亮区域逐渐增长。
同样用上面的图片举例:

pie = cv2.imread('pie.png')

kernel = np.ones((30,30),np.uint8) 
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
dilate_3 = cv2.dilate(pie,kernel,iterations = 3)
res = np.hstack((dilate_1,dilate_2,dilate_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

开运算

开运算也就是将一张图片先腐蚀再膨胀的操作。这个操作可以将原来外面带“刺”的原图片中的“刺”清除掉。如:
在这里插入图片描述

# 开:先腐蚀,再膨胀
img = cv2.imread('erpie.png')
cv2.imshow('src', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

kernel = np.ones((5,5),np.uint8) 
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

处理过后,结果为:
在这里插入图片描述

闭运算

闭运算也就是将一张图片先膨胀再腐蚀的操作。这个操作可以将原来内部含有黑点的原图片中的黑点清除掉。如:
在这里插入图片描述

# 闭:先膨胀,再腐蚀
img = cv2.imread('depie.png')
cv2.imshow('src', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

kernel = np.ones((5,5),np.uint8) 
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

处理过后,结果为:
在这里插入图片描述

梯度运算

梯度运算即用膨胀后的图像减去腐蚀后的图像,从而得到图像轮廓。
同样用之前那张图片举例:

pie = cv2.imread('pie.png')
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)

cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

礼帽操作

礼帽操作实际上是用原始图片减去开运算操作后的图片。我们已经知道,开运算是去“刺”过程,所以礼帽操作实质上保留的是“刺”的部分。用之前使用过的带刺的图片举例:

#礼帽
img = cv2.imread('erpie.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

最终得到:
在这里插入图片描述

黑帽操作

黑帽操作实际上是用闭运算操作后的图片减去原始图片。我们已经知道,闭运算是去噪点的过程,所以黑帽操作实质上保留的是噪点的部分。用之前使用过的带噪点的图片举例:

#黑帽
img = cv2.imread('depie.png')
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()

最终得到:在这里插入图片描述

发布了36 篇原创文章 · 获赞 1 · 访问量 545

猜你喜欢

转载自blog.csdn.net/qq_36758914/article/details/104005473