开操作:图像形态学的重要操纵之一,基于膨胀与腐蚀操作组合形成的;主要是应用在二值图像分析中,灰度图像亦可
开操作 = 腐蚀+膨胀 ,输入图像 + 结构元素
作用:用来消除小物体、平滑较大物体的边界的同时并不明显改变其面积,提取水平或竖直的线
闭操作:图像形态学的重要操纵之一,基于膨胀与腐蚀操作组合形成的;主要是应用在二值图像分析中,灰度图像亦可
闭操作 = 膨胀+腐蚀 ,输入图像 + 结构元素
作用:用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积
python实现
import cv2 def open_demo(image): print(image.shape) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) cv2.imshow("binary", binary) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel) cv2.imshow("open result", binary) def close_demo(image): print(image.shape) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) cv2.imshow("binary", binary) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel) cv2.imshow("close result", binary) if __name__ == "__main__": img = cv2.imread("image/open.jpg") cv2.namedWindow("input image",cv2.WINDOW_AUTOSIZE) cv2.imshow("input image", img) open_demo(img) cv2.waitKey(0) cv2.destroyAllWindows()
开操作结果,尽量保留其他结构元素不变,消除小物体
当我们改变内核的大小,就能达到不同的效果,比如我们设置ksize=(15,1),就可以提取图像中的水平直线
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 1))
binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
同理,我们让ksize=(1,15),就可以提取图像中的垂直直线。结果如下
闭操作结果,填充封闭区域,其他保持不变
当我们改变内核的形状,也能达到不同的效果,比如提取图像中的圆
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
结果如下
src参数:输入图像
op参数:操作类型
MORTH_OPEN 函数做开运算
MORTH_CLOSE 函数做闭运算
MORTH_GRADIENT 函数做形态学梯度运算
MORTH_TOPHAT 函数做顶帽运算
MORTH_BLACKHAT 函数做黑帽运算
MORTH_DILATE 函数做膨胀运算
MORTH_ERODE 函数做腐蚀运算
kernel参数 :内核类型,用getStructuringElement函数得到