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

顶帽、黑帽、形态学梯度

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

结果如下:
python + opencv图像处理——其他形态学操作_第1张图片

你可能感兴趣的:(opencv)