OpenCV的腐蚀、膨胀等形态学方法
1、图像的腐蚀与膨胀
代码测试:
腐蚀:
# -*- coding: utf-8 -*-
# @Time : 2021/8/13
# @Author : ZYh
"""
Introduction:
腐蚀操作:
dst = cv2.erode(src, kernel, anchor, iterations, borderType, borderValue)
参数说明:
kernel->腐蚀使用的核
anchor->可选参数,核的锚点位置
iterations->可选参数,腐蚀操作的迭代次数,默认值为1
borderType->可选参数,边界样式,建议默认
borderValue->可选参数,边界值,建议默认
"""
import cv2 as cv
import numpy as np
image1 = cv.imread('cactus.jpg')
image2 = cv.imread('spider.png')
# 创建3 × 3 数组作为核
k = np.ones((5, 5), np.uint8)
cv.imshow('image1', image1)
cv.imshow('image2', image2)
image1_erode = cv.erode(image1, k)
image2_erode = cv.erode(image2, k)
cv.imshow('image1_erode', image1_erode)
cv.imshow('image2_erode', image2_erode)
cv.waitKey()
cv.destroyAllWindows()
膨胀:
# -*- coding: utf-8 -*-
# @Time : 2021/8/15
# @Author : ZYh
"""
Introduction:
膨胀操作:
dst = cv2.dilate(src, kernel, anchor, iterations, borderType, borderValue)
"""
import cv2 as cv
import numpy as np
image1 = cv.imread('spider.png')
image2 = cv.imread('sunset.jpg')
k = np.ones((5, 5), np.uint8)
cv.imshow('image1', image1)
cv.imshow('image2', image2)
cv.imshow('image1_dilate', cv.dilate(image1, k))
cv.imshow('image2_dilate', cv.dilate(image2, k))
cv.waitKey()
cv.destroyAllWindows()
2、图像开运算、闭运算
开运算:先对图像进行腐蚀操作,再进行膨胀操作
# -*- coding: utf-8 -*-
# @Time : 2021/8/15
# @Author : ZYh
"""
Introduction:
开运算:
作用:抹除图像外部细节(或者噪声)
原理:先腐蚀(erode)再膨胀(dilate)
"""
import cv2 as cv
import numpy as np
image = cv.imread('nigella.png')
k = np.ones((5, 5), np.uint8)
cv.imshow('image', image)
cv.imshow('erode', cv.erode(image, k))
cv.imshow('Open_Operation', cv.dilate(cv.erode(image, k), k))
cv.waitKey()
cv.destroyAllWindows()
3、其他形态学方法
OpenCV提供了一个**morphologyEx()**形态学方法,包含了所有常用的运算
# -*- coding: utf-8 -*-
# @Time : 2021/8/15
# @Author : ZYh
"""
Introduction:
形态学方法:
dst = cv2.morphologyEx(src, op, kernel, anchor, iterations, borderType, borderValue)
参数:
op->操作类型,详见下表
参数值 含义
cv2.MORPH_ERODE 腐蚀操作
cv2.MORPH_DILATE 膨胀操作
cv2.MORPH_OPEN 开运算,先腐蚀再膨胀
cv2.MORPH_CLOSE 闭运算,先膨胀再腐蚀
cv2.MORPH_GRADIENT 梯度运算,膨胀图减腐蚀图,可以得出简易的轮廓
cv2.MORPH_TOPHAT 顶帽运算,原始图像减开运算图像
cv2.MORPH_BLACKHAT 黑帽运算,闭运算图像减原始图像
"""
import cv2 as cv
import numpy as np
image = cv.imread('spider.png')
k = np.ones((5, 5), np.uint8)
cv.imshow('image', image)
# 通过梯度运算画出小蜘蛛的轮廓(梯度运算:得到不精准、大致的轮廓图像)
cv.imshow('GRADIENT', cv.morphologyEx(image, cv.MORPH_GRADIENT, k))
# 通过顶帽运算画出小蜘蛛的腿(顶帽运算:原图 - 开运算)
cv.imshow('TOPHAT', cv.morphologyEx(image, cv.MORPH_TOPHAT, k))
# 通过黑帽运算画出小蜘蛛身上的花纹(黑帽运算:闭运算 - 原图)
image_pattern = cv.imread('spider2.png')
cv.imshow('image_pattern', image_pattern)
cv.imshow('TOPHAT', cv.morphologyEx(image_pattern, cv.MORPH_BLACKHAT, k))
cv.waitKey()
cv.destroyAllWindows()