opencv学习二十一:顶帽、黑帽、形态学梯度

在这里插入图片描述在这里插入图片描述在这里插入图片描述

一、顶帽TOPHAT

又称礼帽,是原始图像与进行开运算之后得到的图像的差。
礼帽图像=原始图像-开运算图像
得到噪声图像
开运算:先腐蚀再膨胀
使用方法:morphologyEx
cv2.MORPH_TOPHAT
结果=cv2.morphologyEx(原始图像,cv2.MORPH_TOPHAT,卷积核)
卷积核示例:k=np.ones((10,10),np.uint8)
代码如下:

import cv2 as cv
import numpy as np

def top_hat_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)
    cv.imshow("tophat", dst)

src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/kaibi.png")  #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
top_hat_demo(src)
#black_hat_demo(src)
#hat_binary_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行截图:
在这里插入图片描述

二、黑帽BLACKHAT

黑帽图像=闭运算图像-原始图像
得到图像内部的小孔,或前景色的小黑点
闭运算:对图像进行先膨胀,再腐蚀。有助于关闭前景物体上的小孔,或者小黑点。
使用对象:二值图像
使用方法:morphologyEx
cv2.MORPH_BLACKHAT
结果=cv2.morphologyEx(原始图像,cv2.MORPH_BLACKHAT,卷积核)
卷积核示例:k=np.ones((10,10),np.uint8)
代码如下:

import cv2 as cv
import numpy as np

def black_hat_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", dst)

src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/kaibi.png")  #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
top_hat_demo(src)
#black_hat_demo(src)
#hat_binary_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行截图:
代码采用了基于灰度度,也可以基于二值图。
采用不同大小的卷积核,得到的噪声小白点也不一样。
在这里插入图片描述

三、梯度运算

形态学梯度是膨胀和腐蚀的差别,结果看上去就像前景物体的轮廓。计算的梯度常见的有三种:
基本梯度:
基本梯度是用膨胀后的图像减去腐蚀后的图像得到差值图像,称为梯度图像,也是OpenCV中支持的计算形态学梯度的方法,而此方法得到的梯度又被称为基本梯度。

内部梯度:
是用原图像减去腐蚀后的图像得到差值图像,称为图像的内部梯度

外部梯度:
图像膨胀后的图像减去原来的图像得到的差值图像,称为图像的外部梯度。

提取物体边缘
基本梯度运算结果=cv2.morphologyEx(源图像img,cv2.MORPH_GRADIENT,卷积核k)
3.1 基本梯度
代码如下:

import cv2 as cv
import numpy as np

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/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/kaibi.png")  #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
gradient2_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行截图:
在这里插入图片描述3.2 内部梯度和外部梯度

import cv2 as cv
import numpy as np

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/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/kaibi.png")  #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
cv.imshow("input image", src)
gradient2_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行截图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44145452/article/details/112800285