图像膨胀和腐蚀
图解
膨胀和腐蚀理解
原理及python实现
opencv中膨胀和腐蚀函数
dilation = cv.dilate(img, kernel) # 膨胀
erosion = cv.erode(img, kernel) # 腐蚀
实验
import cv2 as cv
import numpy as np
img = cv.imread('j.png')
img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,th = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
# 参数1:源图;参数2:核大小;参数3:腐蚀次数
erode1 = cv.erode(th,(3,3),10) # 腐蚀
dilate1 = cv.dilate(th,(3,3),10) # 扩张
result = np.hstack((th,erode1,dilate1))
cv.imshow('result',result)
cv.waitKey(0)
cv.destroyAllWindows()
输出结果类似于上图
cv.erode() 函数参数2:kernel讲解
这个核也叫结构元素,因为形态学操作其实也是应用卷积来实现的。结构元素可以是矩形/椭圆/十字形,可以用cv.getStructuringElement()来生成不同形状的结构元素,比如:
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5)) # 矩形结构
kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5)) # 椭圆结构
kernel = cv.getStructuringElement(cv.MORPH_CROSS, (5, 5)) # 十字形结构
图解生成的各种结构元素
图像开闭运算
原理
开运算:先腐蚀,再膨胀。有效消除物体外的白色噪声。
闭运算:先膨胀,后腐蚀。有效消除物体内的黑色噪声。
python实现
matlab实现
实验
import cv2 as cv
import numpy as np
img = cv.imread('paojie_g.jpg',0)
ret,th = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5)) # 定义结构元素
opening = cv.morphologyEx(th, cv.MORPH_OPEN, kernel) # 开运算
closing = cv.morphologyEx(th, cv.MORPH_CLOSE, kernel) # 闭运算
result = np.hstack((th,opening,closing))
cv.imshow('result',result)
cv.waitKey(0)
cv.destroyAllWindows()
实验结果
左图:原图;中图:开运算结果;右图:闭运算结果
形态学梯度
定义
形态学梯度:膨胀图减去腐蚀图,dilation - erosion,这样会得到物体的轮廓:
左图:原图;右图:形态学梯度得到的图像轮廓
其它形态学运算
顶帽:原图减去开运算后的图:src - opening
tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
黑帽:闭运算后的图减去原图:closing - src
blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)