9.3 Python图像处理之图像数学形态学-灰度形态学
1 算法原理
灰度图像与二值图像的区别在于其记录了灰度信息,所以,形态学处理的定义与二值图像有些不同,因为二值图像可以用一系列的二维坐标来表示图像信息,而灰度图需要一个三维坐标表示,而且二值图像中结构元SE是平坦的,没有灰度信息的,但灰度图中,结构元是可以带有第三维信息的,即结构元也是灰度的,这就带来了一些问题,因为二值图像中,形态学的输出结果完全由输入图像产生,但是结构元一旦引入灰度信息,那么输出结果将不再由输入图像唯一确定。所以,一般情况下,结构元都使用平坦的结构元。
腐蚀与膨胀是形态学的基本操作,在灰度图像中也是如此,在二值图像中腐蚀和膨胀定义为对图像进行 translation 以后的“与”和“或”的逻辑操作结果,在灰度图像中,为了保存灰度信息,“与”和“或”操作被对应的替换成了“最大值”和“最小值”操作这样就给出了灰度图像中腐蚀和膨胀的操作定义。
Erosion(腐蚀),公式如下:
直观上就是,暗的地方会更暗(整体亮度减小)。
Dilation(膨胀),公式如下:
与腐蚀不同的就是与 SE(卷积核) 相加,取最大值。直观上,就是原图亮的地方会更亮(整体亮度增加),且范围扩大。
Open(开启),先腐蚀后膨胀。直观上就是消除了原图上比 SE 小的亮处。
Close(闭合),先膨胀后腐蚀。直观上与 Open 相反,消除了暗处。
2 代码
运行代码说明
1.要改变代码中的图片地址(地址不能有中文)
更改
put(path)
函数中的路径put(r'../image/image1.jpg')
2.注意最后的
plt.savefig('1.new.jpg')
是保存plt图像,如果不使用可以注释掉代码依赖包:
matplotlib 3.4.2 numpy 1.20.3 opencv-python 4.1.2.30
# pip安装 pip install matplotlib numpy opencv-python
import numpy as np
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def put(path):
# 读取图片 0是黑色,255是白色
img = cv2.imread(path)
# 由于cv2.imread 读取图像格式为b,g,r但是 plt显示按照 rgb次序!因此要转换一下。
b, g, r = cv2.split(img)
img2 = cv2.merge([r, g, b])
src = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 设置卷积核
kernel = np.ones((3, 3), np.uint8)
# 图像腐蚀处理
res1 = cv2.erode(src, kernel)
# 图像膨胀处理
res2 = cv2.dilate(src, kernel)
# 图像开运算
res3 = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
# 图像闭运算
res4 = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)
# 图像显示
plt.subplot(231), plt.imshow(img2, plt.cm.gray), plt.title('原始图像'), plt.axis('off')
plt.subplot(232), plt.imshow(src, plt.cm.gray), plt.title('灰度图像'), plt.axis('off')
plt.subplot(233), plt.imshow(res1, plt.cm.gray), plt.title('腐蚀'), plt.axis('off')
plt.subplot(234), plt.imshow(res2, plt.cm.gray), plt.title('膨胀'), plt.axis('off')
plt.subplot(235), plt.imshow(res3, plt.cm.gray), plt.title('开运算'), plt.axis('off')
plt.subplot(236), plt.imshow(res4, plt.cm.gray), plt.title('闭运算'), plt.axis('off')
# plt.savefig('3.new-img.jpg')
plt.show()
# 图像处理函数,要传入路径
put(r'../image/image3.jpg')
3 效果
血小板三个字的变化比较明显