本章节的主要内容是图像形态学,包括以下7个知识点:
1、膨胀
2、腐蚀
3、开操作
4、闭操作
5、形态学梯度
6、顶帽操作
7、黑帽操作
以下代码均在python3.6,opencv4.2.0环境下试了跑一遍,可直接运行。
1、图像形态学基础
膨胀与腐蚀是图像形态学最基础的两个操作,形态学的其它操作都是基于这两个操作基础上得到的,图像形态学是二值图像分析的重要分支学科。
二值图像的腐蚀和膨胀就是将一个结构元素(小型二值图,一般为3*3大小)在一个大的二值图上逐点移动并进行比较,根据比较的结果作出相应处理而已。对二值图像来说,白色被腐蚀即为黑色的膨胀,白色的膨胀就是黑色被腐蚀。要注意的是,膨胀和腐蚀都是不可逆的,即两者不能完全的相互抵消。
膨胀:结构元素的白点与要处理的图形对应像素点只要有一个相同,则该点设为白色,否则仍然为黑色。膨胀可以看成是最大值滤波,即用最大值替换中心像素点。
腐蚀:结构元素的白点与要处理的图形对应像素点全部相同,则该点为白色,否则变为黑色(即被腐蚀掉了)。腐蚀可以看出是最小值滤波,即用最小值替换中心像素点。
开操作:先腐蚀后膨胀的过程称为开运算,具有消除细小物体,来去除噪声,在纤细处分离物体和平滑较大物体边界的作用。
闭操作:先膨胀后腐蚀的过程称为闭运算,具有填充前景物体内细小空洞或者前景物体上的小黑点,连接邻近物体和平滑边界的作用。
形态学梯度:膨胀操作与腐蚀操作的差值,形态学梯度还包括内部梯度和方向梯度,作用:提取前景物体的轮廓。
顶帽操作:原图像与开操作的差值,作用:提取图像中的噪声。
黑帽操作:闭操作与原图像的差值,作用:突出噪声与原始图像的交界处,可近似表现出一些轮廓。
2、图像形态学代码实战
代码语言:javascript复制# -*- coding: utf-8 -*-
import cv2
import numpy as np
img_path = "test1.jpg"
img=cv2.imread(img_path)
cv2.imshow('origin', img)
# 阈值二值化分割
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
ret, threshold_binary = cv2.threshold(gray, 155, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 膨胀
#用numpy生成卷积核
kernel1 = np.ones((3,3),np.uint8)
dilate_img = cv2.dilate(threshold_binary, kernel1, iterations = 1)
cv2.imshow('dilate', dilate_img)
# 腐蚀
#用numpy生成卷积核
erode_img = cv2.erode(threshold_binary, kernel1, iterations = 1)
cv2.imshow('erode', erode_img)
# 开运算:先腐蚀后膨胀
# 具有消除细小物体,来去除噪声,在纤细处分离物体和平滑较大物体边界的作用
kernel2 = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(threshold_binary, cv2.MORPH_OPEN, kernel2)
cv2.imshow('opening',opening)
# 闭运算:先膨胀后腐蚀
# 具有填充前景物体内细小空洞或者前景物体上的小黑点,连接邻近物体和平滑边界的作用
closing = cv2.morphologyEx(threshold_binary, cv2.MORPH_CLOSE, kernel2)
cv2.imshow('closing',closing)
# 形态学梯度
# 膨胀操作与腐蚀操作的差值,形态学梯度还包括内部梯度和方向梯度,作用:提取前景物体的轮廓
kernel3 = np.ones((7,7),np.uint8)
gradient = cv2.morphologyEx(threshold_binary, cv2.MORPH_GRADIENT, kernel3)
cv2.imshow('gradient',gradient)
# 顶帽操作
# 原图像与开操作的差值,作用:提取图像中的噪声
tophat = cv2.morphologyEx(threshold_binary, cv2.MORPH_TOPHAT, kernel3)
cv2.imshow('tophat',tophat)
# 黑帽操作
# 闭操作与原图像的差值,作用:突出噪声与原始图像的交界处,可近似表现出一些轮廓
blackhat = cv2.morphologyEx(threshold_binary, cv2.MORPH_BLACKHAT, kernel3)
cv2.imshow('blackhat',blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
原图
膨胀
腐蚀
开操作
闭操作
形态学梯度
顶帽操作
黑帽操作
以上内容如有错误或者需要补充的,请留言!