9.3 Python图像处理之图像数学形态学-灰度形态学

9.3 Python图像处理之图像数学形态学-灰度形态学

1 算法原理

灰度图像与二值图像的区别在于其记录了灰度信息,所以,形态学处理的定义与二值图像有些不同,因为二值图像可以用一系列的二维坐标来表示图像信息,而灰度图需要一个三维坐标表示,而且二值图像中结构元SE是平坦的,没有灰度信息的,但灰度图中,结构元是可以带有第三维信息的,即结构元也是灰度的,这就带来了一些问题,因为二值图像中,形态学的输出结果完全由输入图像产生,但是结构元一旦引入灰度信息,那么输出结果将不再由输入图像唯一确定。所以,一般情况下,结构元都使用平坦的结构元。

腐蚀与膨胀是形态学的基本操作,在灰度图像中也是如此,在二值图像中腐蚀和膨胀定义为对图像进行 translation 以后的“与”和“或”的逻辑操作结果,在灰度图像中,为了保存灰度信息,“与”和“或”操作被对应的替换成了“最大值”和“最小值”操作这样就给出了灰度图像中腐蚀和膨胀的操作定义。

Erosion(腐蚀),公式如下:

image-20210808213503281

直观上就是,暗的地方会更暗(整体亮度减小)。

Dilation(膨胀),公式如下:

image-20210808213514504

与腐蚀不同的就是与 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 效果

血小板三个字的变化比较明显

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值