顶帽(tophat):是原图像与开操作之间的差值图像。
黑帽(blackhat):是闭操作与原图像的差值图像。
形态学梯度 (Gradient):
1、基本梯度:用膨胀后的图像减去腐蚀后的图像得到的差值图像,称为梯度图像(也是OpenCV中支持的计算形态学梯度的方法)
基本梯度 = 膨胀图像 - 腐蚀图像
2、内部图像 = 原图像 - 腐蚀图像
3、外部梯度 = 膨胀图像 - 原图像
import cv2 as cv
import numpy as np
def top_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, (5, 5))
dst = cv.morphologyEx(binary, cv.MORPH_TOPHAT, kernel)
# 灰度图像需要这些来增加亮度,二值图像不用
# cimage = np.array(gray.shape, np.uint8)
# cimage = 120
# dst = cv.add(dst, cimage)
cv.imshow('tophat', dst)
def black_hat_demo(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
dst = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel)
cimage = np.array(gray.shape, np.uint8)
cimage = 100
dst = cv.add(dst, cimage)
cv.imshow('blackhat', 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, (3, 3))
dst = cv.morphologyEx(binary, cv.MORPH_GRADIENT, kernel)
cv.imshow('tophat', dst)
def gradient2_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) # internal gradient
dst2 = cv.subtract(dm, image) # external gradient
cv.imshow('internal', dst1)
cv.imshow('external', dst2)
src = cv.imread('C:/Users/Y/Pictures/Saved Pictures/demo.png')
cv.namedWindow('input image', cv.WINDOW_AUTOSIZE)
cv.imshow('input image', src)
gradient2_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
以上图像分别是顶帽、黑帽、基本梯度、内部梯度、外部梯度所对应的结果图像。