python + opencv图像处理——其他形态学操作

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

顶帽、黑帽、形态学梯度

顶帽(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()

结果如下:
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiao黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值