开运算与闭运算
在opencv中,开运算(opening)和闭运算(closing)都是图像形态学的操作,它们经常与腐蚀和膨胀操作结合使用,用于图像处理和分析中的一些任务,如去噪、平滑、边缘检测等。
-
开运算(opening)操作的定义为先对图像进行腐蚀操作,再对腐蚀后的图像进行膨胀操作。开运算可以消除图像中的小且细小的噪点,同时保持主要对象的形状和结构。
-
闭运算(closing)操作的定义为先对图像进行膨胀操作,再对膨胀后的图像进行腐蚀操作。闭运算可以填充图像中的小孔洞,平滑图像边缘。
腐蚀和膨胀的原理和应用可以看上一篇博客:opencv基础操作-腐蚀操作-膨胀操作
def read_img(img_path, mode=cv2.imread_color):
"""
:param mode:
:param img_path: 图像路径
:return: array
"""
return cv2.imread(img_path, mode)
def img_show(name, img):
"""
:param name: 窗口名称
:param img: 图像数据array
"""
cv2.imshow(name, img)
cv2.waitkey(0)
cv2.destroyallwindows()
if __name__ == '__main__':
img_path_3 = 'test_img.png'
# 默认读取bgr
image_3 = read_img(img_path_3)
img_3 = cv2.resize(image_3, (224, 224))
# 定义结构元素(kernel)
kernel = np.ones((5, 5), np.uint8)
# 进行开运算
opened_image = cv2.morphologyex(img_3, cv2.morph_open, kernel)
# 进行闭运算
closed_image = cv2.morphologyex(img_3, cv2.morph_close, kernel)
x1 = np.hstack((img_3, opened_image))
x2 = np.hstack((img_3, closed_image))
img_show('--', x1)
img_show('==', x2)
开运算结果(左图为运算前,右图为运算后)
闭运算结果(左图为运算前,右图为运算后)
梯度运算
直观理解
标准范式
# 定义结构元素(kernel)
kernel = np.ones((5, 5), np.uint8)
gradient = cv2.morphologyex(img_3, cv2.morph_gradient, kernel)
结果
礼帽与黑帽
直观理解
- 礼帽 = 原始输入 - 开运算结果
- 黑帽 = 闭运算结果 - 原始输入
标准范式
# 定义结构元素(kernel)
kernel = np.ones((5, 5), np.uint8)
tophat = cv2.morphologyex(img_3, cv2.morph_tophat, kernel)
blackhat = cv2.morphologyex(img_3, cv2.morph_blackhat, kernel)
礼帽结果
黑帽结果
欢迎大家学习交流
发表评论