- OpenCV形态学相关的运算包含腐蚀(MORPH_ERODE),膨胀(MORPH_DILATE),开运算(MORPH_OPEN),闭运算(MORPH_CLOSE),梯度运算(MORPH_GRADIENT),礼帽运算(MORPH_TOPHAT),黑帽运算(MORPH_BLACKHAT)
1.腐蚀操作
在OpenCV中,腐蚀操作通过使用一个结构元素(通常是一个小的矩形、圆形或其他形状的矩阵)来“侵蚀”图像中的前景对象,使得前景区域变小,从而去除小的噪声或细节,或者填补图像中的小孔洞。
- 函数原型:dst =cv2.erode(src,kernel,iterations)
- dst:腐蚀操作结束后的输出图像。
- src :输入的二值图像,通常为单通道灰度图像。
- kerne1 :腐蚀操作的结构元素,用于定义腐蚀的邻域大小和形状。
- iterations :腐蚀操作的迭代次数,表示应用腐蚀的重复次数。
通过调整结构元素的形状和大小以及选代次数,可以控制腐蚀的效果,从而达到去除噪声,缩小目标物体等目的。
import cv2
import numpy as np
img=cv2.imread('./img/hello.png')
kernel=np.ones((5,5),np.uint8) #定义核为5*5的网格
erosion=cv2.erode(img,kernel,iterations=1)
cv2.imshow('img',img)
cv2.imshow('erosion',erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.膨胀操作
膨胀操作是形态学操作中的一种基本操作,主要用于增加或加强图像中的前景区域。膨胀操作通过使用一个结构元素(也称为卷积核)在图像上滑动,将结构元素覆盖区域的最大像素值提取并替换锚点位置的像素值,从而实现图像边界的扩张。
- 函数原型:dst =cv2.dilate(src,kernel,iterations)
import cv2
import numpy as np
img=cv2.imread('./img/hello.png')
kernel=np.ones((5,5),np.uint8) #定义核为5*5的网格
erosion=cv2.erode(img,kernel,iterations=3) #腐蚀操作
dilate=cv2.dilate(erosion,kernel,iterations=3) #膨胀操作
cv2.imshow('img',img)
cv2.imshow('erosion',erosion)
cv2.imshow('dilate',dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
先通过腐蚀操作缩小图像中的物体,去除小噪声点,再通过膨胀操作以填补腐蚀留下的空洞,将前景恢复到腐蚀之前的水平。
3.开运算与闭运算
- 开运算:先腐蚀,再膨胀。
- 闭运算:先膨胀,再腐蚀。
import cv2
import numpy as np
img=cv2.imread('./img/hello.png')
kernel=np.ones((5,5),np.uint8)
opening=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel) #开运算
closing=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel) #闭运算
cv2.imshow('opening',opening)
cv2.imshow('closing',closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.梯度运算
分别对图像进行膨胀和腐蚀操作。梯度运算是膨胀操作过后的图像减去腐蚀操作过后的图像,用于分离图像的边缘。
import cv2
import numpy as np
img=cv2.imread('./img/hello.png')
kernel=np.ones((5,5),np.uint8)
gradient=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel) #梯度运算
cv2.imshow('gradient',gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.礼帽与黑帽
- 礼帽=原始输入减去开运算结果
- 黑帽=闭运算结果减去原始输入
import cv2
import numpy as np
img=cv2.imread('./img/hello.png')
kernel=np.ones((5,5),np.uint8)
tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel) #礼帽
blackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel) #黑帽
cv2.imshow('tophat',tophat)
cv2.imshow('blackhat',blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()