前言
学习不同的形态学操作,例如腐蚀,膨胀,开运算,闭运算等
我们要学习的函数有:cv2.erode(),cv2.dilate(),cv2.morphologyEx() 等
正文
腐蚀
就像土壤侵蚀一样,这个操作会把前景物体的边界腐蚀掉(但是前景仍然 是白色)。这是怎么做到的呢?卷积核沿着图像滑动,如果与卷积核对应的原图 像的所有像素值都是 1,那么中心元素就保持原来的像素值,否则就变为零。
效果图
膨胀
与腐蚀相反,与卷积核对应的原图像的像素值中只要有一个是 1,中心元 素的像素值就是 1。所以这个操作会增加图像中的白色区域(前景)。一般在去噪声时先用腐蚀再用膨胀。因为腐蚀在去掉白噪声的同时,也会使前景对象变 小。所以我们再对他进行膨胀。这时噪声已经被去除了,不会再回来了,但是 前景还在并会增加。膨胀也可以用来连接两个分开的物体。
效果图
开运算
先进腐蚀再进行膨胀就叫做开运算。就像我们上面介绍的那样,它被用来去除噪声。
效果图
从上面这个图片,你可以很清楚的看到,这个函数费尽心机的将图片的小白点给抹掉咯。
这些就是白噪声。
闭运算
效果图
形态学梯度
其实就是一幅图像膨胀与腐蚀的差别。 结果看上去就像前景物体的轮廓。
效果图
礼帽
图像礼帽 也叫图像顶帽
礼帽图像=原始图像-开运算图像
得到噪声图像
开运算:先腐蚀再膨胀
使用对象:二值图像
效果图
闭帽
黑帽图像=闭运算图像-原始图像
得到图像内部的小孔,或前景色的小黑点
闭运算:对图像进行先膨胀,再腐蚀。有助于关闭前景物体上的小孔,或者小黑点。
使用对象:二值图像
效果图
code
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# morphologicalPicture.jpg :这张是原图
# whiteNoise.jpg:这张是有白噪声的图片
# filingHole.jpg: 这张是原图之中有小洞的图片
src = cv.imread("../../images/filingHole.jpg")
kernel = np.ones((5,5),np.uint8)
erosion = cv.erode(src,kernel,iterations=1)
dilation = cv.dilate(src,kernel,iterations=1)
opening = cv.morphologyEx(src,cv.MORPH_OPEN,kernel)
closing = cv.morphologyEx(src,cv.MORPH_CLOSE,kernel)
gradient = cv.morphologyEx(src,cv.MORPH_GRADIENT,kernel)
topHat = cv.morphologyEx(src,cv.MORPH_TOPHAT,kernel)
blackHat = cv.morphologyEx(src,cv.MORPH_CLOSE,kernel)
cv.imshow("gradient",gradient)
cv.imshow("erosionImage",erosion)# 变瘦了一点
cv.imshow('src', src)
cv.imshow("dilatoionImage",dilation)
cv.imshow("opening",opening)
cv.imshow("closing",closing)
cv.imshow("topHat",topHat)
cv.imshow("blackHat",blackHat)
cv.waitKey(0) # 等有键输入或者1000ms后自动将窗口消除,0表示只用键输入结束窗口
cv.destroyAllWindows()