顶帽 tophat
原图像与开操作之间的差值图像
黑帽blackhat
原图像与闭操作之间的差值图像
形态学梯度
- 内部梯度
原图像减去腐蚀之后的图像得到的差值图像 - 外部梯度
图像膨胀之后再减去原来图像得到的差值图像
相关代码
顶帽操作
import cv2 as cv
def top_hat_demo(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
# 顶帽操作
dst = cv.morphologyEx(gray, cv.MORPH_TOPHAT, kernel)
# cimage = np.array(gray.shape, np.uint8)
cimage = 120
dst = cv.add(dst, cimage)
cv.imshow("tophat", dst)
src = cv.imread("image20.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
top_hat_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
黑帽操作
# 修改形态学操作方式为 cv.MORPH_BLACKHAT
dst = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel)
修改核大小可以得到不同的效果
梯度操作
- 一般梯度操作
def gradient_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("MORPH_GRADIENT", 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)