最基础的形态学操作即腐蚀操作和膨胀操作,在此基础之上,又出现了开运算、闭运算、梯度运算、礼帽与黑帽操作。所有的形态学操作只针对二值图片。
腐蚀操作
首先,读入一张二值图片。
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()
最终得到: