python+opencv 其他形态学操作

顶帽(tophat):是原图像与开操作之间的差值图像。

黑帽(blackhat):是闭操作与原图像的差值图像。

形态学梯度 (Gradient):

1、基本梯度:用膨胀后的图像减去腐蚀后的图像得到的差值图像,称为梯度图像(也是OpenCV中支持的计算形态学梯度的方法)

基本梯度 = 膨胀图像 - 腐蚀图像

2、内部图像 = 原图像  -  腐蚀图像

3、外部梯度  =  膨胀图像  -  原图像

import cv2 as cv
import numpy as np


def top_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, (5, 5))
    dst = cv.morphologyEx(binary, cv.MORPH_TOPHAT, kernel)
    # 灰度图像需要这些来增加亮度,二值图像不用
    # cimage = np.array(gray.shape, np.uint8)
    # cimage = 120
    # dst = cv.add(dst, cimage)
    cv.imshow('tophat', dst)


def black_hat_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
    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)


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, (3, 3))
    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)

    
src = cv.imread('C:/Users/Y/Pictures/Saved Pictures/demo.png')
cv.namedWindow('input image', cv.WINDOW_AUTOSIZE)
cv.imshow('input image', src)
gradient2_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

以上图像分别是顶帽、黑帽、基本梯度、内部梯度、外部梯度所对应的结果图像。

发布了70 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Acmer_future_victor/article/details/104160585