阈值分割的结果经常包含一些干扰,形态学能够用来调整分割区域的形状以获得比较理想的结果。
常用的形态学处理包括:腐蚀、膨胀、开运算、闭运算、顶帽运算、地帽运算,其中腐蚀和膨胀是最基础的方法。
文章目录
腐蚀
- 取每一个位置的矩形领域内值的最小值作为该位置的输出灰度值,领域可以是椭圆形、十字交叉形等。
- 腐蚀后输出图像的总体亮度的平均值比起原图会有所降低。
- 针对阈值分割后前景是白色的二值图,可以通过
API
erode(src,element,dst,anchor,iterations,borderType,borderValue
import cv2
src = cv2.imread(r'C:\Users\h\Desktop\image\lena.jpg', cv2.IMREAD_GRAYSCALE)
otThe = 0
maxval = 255
otThe, I = cv2.threshold(src, otThe, maxval, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
# 创建矩形结构元
s= cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
# 腐蚀图像
r = cv2.erode(I,s)
# 边界提取
e = I-r
cv2.imshow("src",src)
cv2.imshow("I",I)
cv2.imshow("erode",r)
cv2.imshow("edge",e)
cv2.waitKey(0)
cv2.destroyAllWindows()
膨胀
膨胀是取每一个位置领域内的最大值
import cv2
src = cv2.imread(r'C:\Users\h\Desktop\image\ti.jpg', cv2.IMREAD_GRAYSCALE)
otThe = 0
maxval = 255
otThe, I = cv2.threshold(src, otThe, maxval, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
# 创建十字结构元
s= cv2.getStructuringElement(cv2.MORPH_CROSS,(3,5))
# 膨胀图像
r = cv2.dilate(I,s)
# cv2.imshow("src",src)
cv2.imshow("I",I)
cv2.imshow("dilate",r)
cv2.waitKey(0)
cv2.destroyAllWindows()
开运算和闭运算
- 开运算
- 先腐蚀后膨胀的过程称为开运算
- 消除亮度较高的细小区域、在详细点初分离物体;对于较大物体,可以在不明显改变其面积的情况下平滑其边界等作用。
- 闭运算
- 先膨胀后腐蚀
- 填充白色物体内细小黑色空洞的区域、连接邻近物体。
API
morphologyEx(src,op,element,anchor,iterations,borderType,borderValue)
参数 | 解释 |
---|---|
op | MORPH_OPEN :开运算 MORPH_CLOSE :闭运算 MORPH_GRADIENT :形态梯度 MORPH_TOPHAT :顶帽运算 MORPH_BLACKHAT :底帽运算 |
"""
cv2.morphologyEx(src, # 输入图片
op, # 需要处理类型的函数:(cv2.MORPH_OPEN,cv2.MORPH_CLOSE,cv2.MORPH_GRADIENT)
kernel, # 卷积核大小
anchor=None,
iterations=None, #迭代次数,默认1次
borderType=None,
borderValue=None)
"""
"""
cv2.morphologyEx(src, # 输入图片
op, # 需要处理类型的函数:(cv2.MORPH_OPEN,cv2.MORPH_CLOSE,cv2.MORPH_GRADIENT)
kernel, # 卷积核大小
dst=None,
anchor=None,
iterations=None, #迭代次数,默认1次
borderType=None,
borderValue=None)
"""
import cv2
import numpy as np
original_img = cv2.imread(r'C:\Users\h\Desktop\image\lena.jpg', cv2.IMREAD_GRAYSCALE)
src = cv2.resize(original_img,None,fx=0.8,fy=0.8,
interpolation = cv2.INTER_CUBIC)
otThe = 0
maxval = 255
otThe, gray_res= cv2.threshold(src, otThe, maxval, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)) #定义矩形结构元素
closed = cv2.morphologyEx(gray_res, cv2.MORPH_CLOSE, kernel,iterations=1) #闭运算
opened = cv2.morphologyEx(gray_res, cv2.MORPH_OPEN, kernel,iterations=1) #开运算
gradient = cv2.morphologyEx(gray_res, cv2.MORPH_GRADIENT, kernel) #梯度
#显示如下图像
cv2.imshow("gray_res", gray_res)
cv2.imshow("Close1",closed)
cv2.imshow("Open1", opened)
cv2.imshow("gradient", gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
经过一次开运算后,周围细小的亮度较高的区域别消除,当然可能会损失一些细节
经过闭运算,可以消除一些黑色区域
梯度运算,可以获得图像的边缘区域(二值更明显)
顶帽
顶帽变换的定义是 图像减去开运算结果
原图减去开运算结果得到原图中灰度较亮的区域,又称白顶帽变换
作用:校正不均匀光照
底帽
图像减去闭运算结果 得到原图中灰度较暗的区域,又称黑顶帽变换
形态学梯度
膨胀结果减去腐蚀结果 -> 图像中物体的边界
膨胀:增大亮度高的区域的面积
腐蚀:减小亮度高的区域的面积