一、顶帽
又称礼帽,是原始图像与进行开运算之后得到的图像的差。
因为开运算到来的结果是放大了裂痕或者局部低亮度的区域,因此,从原图中减去运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。
顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
def tophat_demo(img):
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))
dst = cv.morphologyEx(thresh, cv.MORPH_TOPHAT, kernel)
cv.imshow('sda', dst)
cimage = np.array(thresh.shape, np.uint8)
cimage = 120
dst = cv.add(dst, cimage)
cv.imshow('tophat', dst)
二、黑帽
是进行闭运算以后得到的图像与原图像的差。
黑帽运算之后的效果图突出了与原图像轮廓周围的区域更暗的区域,且这一操作和选择的核大小相关。所以黑帽运算用来分离比邻近点暗一些的斑块。
def hat_binary_demo(img):
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))
dst = cv.morphologyEx(thresh, cv.MORPH_BLACKHAT, kernel)
cv.imshow('blackhat', dst)
三、形态学梯度
形态学梯度是膨胀和腐蚀的差别,结果看上去就像前景物体的轮廓。计算的梯度常见的有三种:
基本梯度:
基本梯度是用膨胀后的图像减去腐蚀后的图像得到差值图像,称为梯度图像,也是OpenCV中支持的计算形态学梯度的方法,而此方法得到的梯度又被称为基本梯度。
内部梯度:
是用原图像减去腐蚀后的图像得到差值图像,称为图像的内部梯度
外部梯度:
图像膨胀后的图像减去原来的图像得到的差值图像,称为图像的外部梯度。
def gradient_demo(img):
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
cv.imshow('thresh', thresh)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5,5))
#基本梯度
dst = cv.morphologyEx(thresh, cv.MORPH_GRADIENT, kernel)
cv.imshow('gradient', dst)
#内部梯度
erode = cv.erode(img, kernel)
dst1 = cv.subtract(img, erode)
cv.imshow('inernal', dst1)
#外部梯度
dilate = cv.dilate(img, kernel)
dst2 = cv.subtract(dilate, img)
cv.imshow('external', dst2)
我们直接都用原图像直接计算了