【OpenCv 4 Python 3.7】图像形态学操作之顶帽、黑帽、形态学梯度

39 篇文章 9 订阅
30 篇文章 5 订阅

1、 顶帽

是原图像与开操作之间的差值图像
开操作先腐蚀后膨胀,开操作之后就只剩下白色的矩形,原图减去矩形就是下面的。。
在这里插入图片描述

2、黑帽

是闭操作图像与源图像的差值图像

在这里插入图片描述

3、形态学梯度

 基本梯度 基本梯度是用膨胀后的图像减去腐蚀后的图像得到差值
图像,称为梯度图像也是opencv中支持的计算形态学 梯度的方法,而此方法得到梯度有被称为基本梯度。

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

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

代码实现:

 import cv2 as cv
import numpy as np

#顶帽 黑帽:用灰度图像
def hat_gray_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)#灰度图像
    #结构元素
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))
    #形态学操作:MORPH_TOPHAT黑帽   cv.MORPH_TOPHAT:顶帽
    dst = cv.morphologyEx(gray, cv.MORPH_TOPHAT, kernel)
    #cimage 和 gray的大小相同
    cimage = np.array(gray.shape, np.uint8)
    cimage = 120;
    #提高亮度
    dst = cv.add(dst, cimage)
    cv.imshow("tophat", 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)
    cv.imshow("tophat", dst)


def gradient_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, (3, 3))
    #MORPH_GRADIENT:梯度
    dst = cv.morphologyEx(binary, cv.MORPH_GRADIENT, kernel)
    cv.imshow("tophat", 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)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("E:/ji_qi_xue_xi/opencv_kejian/opencv_python_image/test.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
gradient2_demo(src)
cv.waitKey(0)

cv.destroyAllWindows()

gradient2_demo 结果:

在这里插入图片描述

函数补充说明

open_binary=cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)
close_binary=cv.morphologyEx(binary,cv.MORPH_CLOSE,kernel)

1
函数参数:

第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U,CV_16U,CV_16S, CV_32F 或CV_64F。

第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。

第三个参数,int类型的op,表示形态学运算的类型,可以是如下之一的标识符:
MORPH_OPEN – 开运算(Opening operation)
MORPH_CLOSE – 闭运算(Closing operation)
MORPH_GRADIENT -形态学梯度(Morphological gradient)
MORPH_TOPHAT - “顶帽”(“Top hat”)
MORPH_BLACKHAT - “黑帽”(“Black hat“)

第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。

第五个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。

第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。

第八个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值