一、形态学运算基本原理
常用的形态学处理包括:腐蚀、膨胀、开运算、闭运算、顶帽运算、底帽运算。
腐蚀:类似于中值平滑操作,它是取每一个位置邻域内值的最小值作为该位置的输出灰度值。不同的是,这里的邻域不再单纯是矩形结构的,可以是椭圆形结构、可以是十字交叉形结构。(可以减小亮度高的区域的面积)
膨胀:类似于中值平滑操作,它是取每一个位置邻域内值的最大值作为该位置的输出灰度值,同样,邻域的形状由结构元决定。既然取邻域内的最大值,那么输出图像的总体亮度的平均值比起原图会有所上升,而图像中较亮物体的尺寸会变大;相反,较暗物体的尺寸会减小,甚至会消失。(可以增大亮度高的区域的面积)
开运算:先腐蚀,再膨胀。可以消除暗背景下的较亮区域。
闭运算:先膨胀,再腐蚀。可以删除亮度较高背景下的较暗区域。
顶帽变换:图像减去开运算的结果。主要作用:校正不均匀光照。
底帽变换:图像减去闭运算的结果。
形态学梯度:膨胀的结果减去腐蚀的结果。
二、实现代码及展示
import cv2
import numpy as np
pic = './Lenna.jpg'
src = cv2.imread(pic, cv2.IMREAD_UNCHANGED) # 图像的二值化 ,这里没有做阈值处理
kernel = np.ones((5, 5), np.uint8) # 设置卷积核5*5
erosion = cv2.erode(src, kernel) # 图像的腐蚀,默认迭代次数
dst = cv2.dilate(erosion, kernel) # 图像的膨胀
cv2.imshow('origin', src) # 二值化图像展示
cv2.imshow('after erosion', erosion) # 腐蚀后展示
cv2.imshow('after dilate', dst) # 膨胀后展示
cv2.imwrite("erosion.jpg",erosion) # 保存图像
cv2.waitKey(0)