开运算(Opening)原理和作用:
开运算是图像形态学处理中的一种操作,它由两个步骤组成:先进行腐蚀(Erosion),再进行膨胀(Dilation)。开运算的主要目的是消除图像中的小型噪点(白色噪点对应的是小型黑色区域,黑色噪点对应的是小型白色区域),同时保留图像中大型物体的结构特征。
开运算的数学表达:
给定输入图像 I I I、结构元素 B B B,开运算可以用数学表达式表示为:
Opening ( I , B ) = Dilation ( Erosion ( I , B ) , B ) \text{Opening}(I, B) = \text{Dilation}(\text{Erosion}(I, B), B) Opening(I,B)=Dilation(Erosion(I,B),B)
其中, Erosion ( I , B ) \text{Erosion}(I, B) Erosion(I,B) 表示输入图像 I I I被结构元素 B B B腐蚀的结果, Dilation ( ⋅ ) \text{Dilation}(\cdot) Dilation(⋅) 表示膨胀操作。
适用场景:
- 去除小型噪点或者孤立的像素;
- 平滑物体边缘,保留物体的整体结构;
- 提取比结构元素更小的物体。
代码示例:
以下是使用 OpenCV 和 Python 进行开运算的简单示例:
import cv2
import numpy as npdef show_images(image):cv2.namedWindow('image',cv2.WINDOW_KEEPRATIO)cv2.imshow('image',image)cv2.waitKey()cv2.destroyAllWindows()def Open(image):# 定义结构元素(可以自定义不同形状和大小的结构元素)kernel = np.ones((5, 5), np.uint8) # 5x5 的全白正方形作为结构元素# 进行开运算opened_image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)return opened_imageif __name__ == '__main__':# 读取图像img = cv2.imread('cat-dog.png', flags=0)re_img=Open(img)# # 将四张图像连接成一个大图像# top_row = np.hstack((img, re_img[0]))# bottom_row = np.hstack((re_img[1], re_img[2]))# combined_img = np.vstack((img, re_img))combined_img=np.hstack((img,re_img))show_images(combined_img)