写在前面
本篇文章是opencv学习的第三篇文章,主要讲解了图像的形态学有关操作,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正❤️
写在中间
读完这篇文章后,相信您便能信手拈来下面图片的效果。
一、腐蚀操作
( 1 )简单介绍
在图像处理中,腐蚀(Erosion)是一种常见的形态学操作,它可以将图像中的细节部分缩小或者消失。简单来说就是将图像中的毛刺腐蚀掉。
( 2 )操作实现
cv2.erode(img, kernel, iterations)
其他参数暂省略
img
是输入图像
kernel
是腐蚀操作的核,表示每个像素点周围的像素点的位置和权重
iterations
是操作的次数
( 3 )代码示例
假设我们有一张二值化图像,我们可以通过以下代码实现一次腐蚀操作:
import cv2
import numpy as np
img = cv2.imread('image.png', 0)
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations = 1)
cv2.imshow('Erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
( 4 )效果展示
二、膨胀操作
( 1 )简单介绍
膨胀(Dilation)是与腐蚀相反的形态学操作,它可以使图像中的细节部分增大或者扩张。在图像处理中,膨胀操作可以用来连接断开的元素、消除小的空洞或者孔洞等。
( 2 )操作实现
cv2.dilate(img, kernel, iterations)
img
是输入图像,
kernel
是膨胀操作的核,表示每个像素点周围的像素点的位置和权重
iterations
是操作的次数,
( 3 )代码示例
同样是假设我们有一张二值化图像,我们可以通过以下代码实现膨胀操作:
import cv2
import numpy as np
img = cv2.imread('image.png', 0)
kernel = np.ones((3, 3), dtype=np.uint8)
dilate = cv2.dilate(img, kernel, 2) # 2为迭代次数,也就是执行2次膨胀操作
plt.imshow(dilate)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
( 4 )效果展示
三、开运算与闭运算
( 1 )简单介绍
仔细观察上面的图片,就会发现腐蚀操作虽然去除了毛刺,但使原始的线条变细
除了单独的腐蚀和膨胀操作,还可以通过它们的组合来实现更为复杂的形态学操作。其中,开运算和闭运算是两种常见的组合形态学操作,它们可以用来去噪声、消除空洞等一系列操作。下面,我们分别来介绍一下这两个操作。
开运算:先腐蚀,再膨胀
闭运算:先膨胀,再腐蚀
( 2 )操作实现
cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
img
是输入图像
cv2.MORPH_OPEN
是一个常量,代表开运算,是指将一个图像先进行腐蚀操作,然后再进行膨胀操作;
cv2.MORPH_CLOSE
是一个常量,代表闭运算,是指将一个图像先进行膨胀操作,然后再进行腐蚀操作;
kernel
是一个结构元素,用于定义形态学操作的形状和大小
( 3 )代码示例
# 开运算
img = cv2.imread("D:\python\Program\pythonProject\photos\csdn.png")
kernel = np.ones((5, 5), np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
plt.imshow(opening)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
# 闭运算
img = cv2.imread("D:\python\Program\pythonProject\photos\csdn.png")
kernel = np.ones((5, 5), np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
plt.imshow(closing)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
( 4 )效果展示
开运算
闭运算
四、梯度计算
( 1 )简单介绍
梯度运算就是用膨胀的图像减去腐蚀的图像,就可以获得原图像的边缘信息(梯度信息)。简言之,就是梯度=膨胀-腐蚀
( 2 )操作实现
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel_gradient, iterations=1)
img
是输入图像
cv2.MORPH_GRADIENT
表示要进行的形态学操作类型,这里是梯度操作
kernel
是一个结构元素,用于定义形态学操作的形状和大小
iterations=1
:形态学操作的迭代次数,用于指定重复执行操作的次数。在这里,梯度操作只执行一次,因此该参数的值为1
( 3 )代码示例
img = cv2.imread("D:\python\Program\pythonProject\photos\csdn.png")
kernel = np.ones((7, 7), np.uint8)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
plt.imshow(gradient)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
( 4 )效果展示
五、礼帽与黑帽
( 1 )简单介绍
礼帽=原始输入-开运算结果
黑帽=闭运算-原始输入
( 2 )操作实现
cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
( 3 )代码示例
# 礼帽运算
img = cv2.imread("D:\python\Program\pythonProject\photos\csdn.png")
kernel = np.ones((7, 7), np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
plt.imshow(tophat)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
# 黑帽运算
img = cv2.imread("D:\python\Program\pythonProject\photos\csdn.png")
kernel = np.ones((7, 7), np.uint8)
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
plt.imshow(blackhat)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
( 4 )效果展示
礼帽:
黑帽:
写在最后
👍🏻 点赞,你的认可是我创作的动力!
⭐ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!