开运算(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 np
def 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_image
if __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)