一、顶帽
又称礼帽,是原始图像与进行开运算之后得到的图像的差。
因为开运算到来的结果是放大了裂痕或者局部低亮度的区域,因此,从原图中减去运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。
顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
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)
![](https://i-blog.csdnimg.cn/blog_migrate/7589b5ab376392a2cc2403712da33bda.png)
二、黑帽
是进行闭运算以后得到的图像与原图像的差。
黑帽运算之后的效果图突出了与原图像轮廓周围的区域更暗的区域,且这一操作和选择的核大小相关。所以黑帽运算用来分离比邻近点暗一些的斑块。
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)
![](https://i-blog.csdnimg.cn/blog_migrate/72cb8e7ff54bf50c75c2f8e852566550.png)
三、形态学梯度
形态学梯度是膨胀和腐蚀的差别,结果看上去就像前景物体的轮廓。计算的梯度常见的有三种:
基本梯度:
基本梯度是用膨胀后的图像减去腐蚀后的图像得到差值图像,称为梯度图像,也是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)
我们直接都用原图像直接计算了
![](https://i-blog.csdnimg.cn/blog_migrate/0e771e53b1cf3da8c02df837aabc688c.png)