顶帽(Top Hat)
原图像与开运算结果图之差
dst = tophat( src, element ) = src - open( src, element )
kernel=cv.getStructuringElement(cv.MORPH_RECT,(5,5))
dst=cv.morphologyEx(gray,cv.MORPH_TOPHAT,kernel)#顶帽
运行结果
灰度图像顶帽
二值化图像顶帽
黑帽(Black Hat)
闭运算结果图与原图像之差
dst = blackhat( src, element ) = close( src, element ) - src
kernel=cv.getStructuringElement(cv.MORPH_RECT,(5,5))
dst = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel)#黑帽
运行结果
灰度图像黑帽
二值化图像黑帽
形态学梯度(Morphological Gradient)
形态梯度
膨胀图与腐蚀图之差
dst = morph_{grad}( src, element ) = dilate( src, element ) - erode( src, element )
能够保留物体的边缘轮廓,如下所示:
内部梯度
原图像-腐蚀后的图像得到的差值图像
kernel=cv.getStructuringElement(cv.MORPH_RECT,(3,3))
em=cv.erode(image,kernel)
dst1=cv.subtract(image,em)#内梯度
运行结果
外部梯度
膨胀后的图像-原图像得到的差值图像
kernel=cv.getStructuringElement(cv.MORPH_RECT,(3,3))
dm=cv.dilate(image,kernel)
dst2=cv.subtract(dm,image)#外梯度
运行结果
完整代码
import cv2 as cv
import numpy as np
#灰度图像顶帽、黑帽
def hat_gray_demo(image):
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
kernel=cv.getStructuringElement(cv.MORPH_RECT,(5,5))
#dst=cv.morphologyEx(gray,cv.MORPH_TOPHAT,kernel)#顶帽
dst = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel)#黑帽
cimage=np.array(gray.shape,np.uint8)#新建一个数组
cimage=100#数组每个数都赋值为100
dst=cv.add(dst,cimage)#增加亮度
cv.imshow("hat_gray_demo",dst)
#二值化图像顶帽、黑帽
def hat_binary_demo(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (9, 9))
dst=cv.morphologyEx(gray,cv.MORPH_TOPHAT,kernel)#顶帽
#dst = cv.morphologyEx(binary, cv.MORPH_BLACKHAT, kernel) # 黑帽
cv.imshow("hat_binary_demo", dst)
#形态学梯度
def gradient_demo(image):
kernel=cv.getStructuringElement(cv.MORPH_RECT,(3,3))
dm=cv.dilate(image,kernel)
em=cv.erode(image,kernel)
dst1=cv.subtract(image,em)#内梯度
dst2=cv.subtract(dm,image)#外梯度
cv.imshow("internal",dst1)
cv.imshow("external",dst2)
src = cv.imread("D:/OpenCV/opencv/sources/samples/data/pic1.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
#hat_gray_demo(src)
#hat_binary_demo(src)
gradient_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
print("Hi,python!")