顶帽、黑帽、形态学梯度
顶帽(tophat)
是 源图像与开操作之间的差值图像
黑帽(blackhat)
是闭操作图像与源图像的差值图像
形态学梯度(Gradient)
1、基本梯度:基本梯度是用膨胀后的图像减去腐蚀后的图像得到差值图像,称为梯度图像也是opencv中支持的计算形态学梯度的方法,而此方法得到梯度有被称为基本梯度
2、内部梯度:是用源图像减去腐蚀之后的图像得到差值图像,称为图像的内部梯度
3、外部梯度:图像膨胀之后再减去原来的图像得到的差值图像,称为图像的外部梯度
from matplotlib import pyplot as plt
from cv2 import cv2 as cv
import numpy as np
#顶帽
def tophat_demo(image):
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15))#获取结构元素
dst = cv.morphologyEx(gray,cv.MORPH_TOPHAT,kernel)
cimage = np.array(gray.shape,np.uint8)
cimage = 100
dst = cv.add(dst,cimage)#提升亮度
cv.imshow("tophat_demo",dst)
#黑帽
def blackhat_demo(image):
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15))#获取结构元素
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_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,(15,15))#获取结构元素
dst = cv.morphologyEx(binary,cv.MORPH_BLACKHAT,kernel)#黑帽
#dst = cv.morphologyEx(binary,cv.MORPH_TOPKHAT,kernel)#顶帽
cv.imshow("hat_binary_demo",dst)
#图像梯度
def hat_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('hat_gradient_demo',dst)
#内外部梯度
def hat_inout_gradient_demo(image):
kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))
dn = cv.dilate(image,kernel)
en = cv.erode(image,kernel)
dst1 = cv.subtract(image,en)#internal gradient
dst2 = cv.subtract(dn,image)#external gradient
cv.imshow('internal gradient',dst1)
cv.imshow('external gradient',dst2)
if __name__ == "__main__":
filepath = "C:\\pictures\\others\\6.jpg"
img = cv.imread(filepath) # blue green red
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",img)
tophat_demo(img)
blackhat_demo(img)
hat_binary_demo(img)
hat_gradient_demo(img)
hat_inout_gradient_demo(img)
cv.waitKey(0)
cv.destroyAllWindows()
结果如下:

本文深入探讨了形态学图像处理中的顶帽、黑帽及梯度运算原理与应用,通过使用OpenCV库,详细介绍了如何实现这些操作,包括基本梯度、内部梯度和外部梯度的计算,并提供了具体的Python代码示例。
2万+

被折叠的 条评论
为什么被折叠?



