opencv学习-形态学处理

阈值分割的结果经常包含一些干扰,形态学能够用来调整分割区域的形状以获得比较理想的结果。
常用的形态学处理包括:腐蚀、膨胀、开运算、闭运算、顶帽运算、地帽运算,其中腐蚀和膨胀是最基础的方法。

文章目录

腐蚀

  • 取每一个位置的矩形领域内值的最小值作为该位置的输出灰度值,领域可以是椭圆形、十字交叉形等。
  • 腐蚀后输出图像的总体亮度的平均值比起原图会有所降低。
  • 针对阈值分割后前景是白色的二值图,可以通过

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

opencv学习-形态学处理

膨胀

膨胀是取每一个位置领域内的最大值

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

开运算和闭运算

  • 开运算
  1. 先腐蚀后膨胀的过程称为开运算
  2. 消除亮度较高的细小区域、在详细点初分离物体;对于较大物体,可以在不明显改变其面积的情况下平滑其边界等作用。
  • 闭运算
  1. 先膨胀后腐蚀
  2. 填充白色物体内细小黑色空洞的区域、连接邻近物体。

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

经过一次开运算后,周围细小的亮度较高的区域别消除,当然可能会损失一些细节
经过闭运算,可以消除一些黑色区域
梯度运算,可以获得图像的边缘区域(二值更明显)

顶帽

顶帽变换的定义是 图像减去开运算结果
原图减去开运算结果得到原图中灰度较亮的区域,又称白顶帽变换
作用:校正不均匀光照

底帽

图像减去闭运算结果 得到原图中灰度较暗的区域,又称黑顶帽变换

形态学梯度

膨胀结果减去腐蚀结果 -> 图像中物体的边界
膨胀:增大亮度高的区域的面积
腐蚀:减小亮度高的区域的面积

上一篇:腐蚀与膨胀


下一篇:OpenCV 形态学变换 morphologyEx函数