五 OpenCV 图像处理 3-形态转换
形态学转换
参考:opencv 官方教材
·不同的形态学转换:腐蚀、膨胀、开运算、闭运算
·函数 :erode/dilate/morphologyEx
·Erode 腐蚀
将目标对象的边界腐蚀掉,原理为卷积核为中心为1其他为0的沿着图像滑动卷积,目的,将两个重叠的物体通过腐蚀分离出边界
import cv2 as cv import numpy as np import matplotlib.pyplot as plt
#img = cv.imread('E:\\技术文档\\06CV\\erode.png',0) img = cv.imread('E:\\erode.png',0)
kernel = np.ones((5,5),np.uint8) erosion = cv.erode(img,kernel,iterations=1)
plt.subplot(321),plt.imshow(img),plt.title('Original') plt.subplot(322),plt.imshow(erosion),plt.title('Erode')#标题
plt.show()
|
iterative 1与10次的结果
·Dilate膨胀
与卷积核对应的原图像的像素值中只要有一个是 1,中心元 素的像素值就是 1。所以这个操作会增加图像中的白色区域(前景)。一般在去 噪声时先用腐蚀再用膨胀。因为腐蚀在去掉白噪声的同时,也会使前景对象变 小。所以我们再对他进行膨胀。这时噪声已经被去除了,不会再回来了,但是 前景还在并会增加。膨胀也可以用来连接两个分开的物体。
dilation = cv.dilate(img,kernel,iterations = 1) |
·开运算
先进性腐蚀再进行膨胀就叫做开运算,用来去除噪声。就像我们上面介绍的Erode/Dilate
opening = cv.morphologyEx(img,cv.MORPH_OPEN,kernel) |
·闭运算
先膨胀再腐蚀,为闭运算
closing = cv.morphologyEx(img,cv.MORPH_CLOSE,kernel) |
·形态学梯度
其实就是一幅图像膨胀与腐蚀的差别,结果看上去,是物体的轮廓
gradient = cv.morphologyEx(img,cv.MORPH_GRADIENT,kernel) |
·礼帽
原始图-开运算的图像=礼帽图像
tophat = cv.morphologyEx(img,cv.MORPH_TOPHAT,kernel)
·黑帽
进行闭运算之后得到的图像与原始图像的差
blackhat= cv.morphologyEx(img,cv.MORPH_BLACKHAT,kernel) |
·结构化元素
前面我们构造卷积核的时候,都是方形的,但是有时候我想要圆形的kernel
# Rectangular Kernel >>> cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)) array([[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]], dtype=uint8) # Elliptical Kernel >>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)) array([[0, 0, 1, 0, 0], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [0, 0, 1, 0, 0]], dtype=uint8) # Cross-shaped Kernel >>> cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5)) array([[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [1, 1, 1, 1, 1], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0]], dtype=uint8)
|