形态学处理腐蚀和膨胀

图像的腐蚀和膨胀都属于形态学的基本运算。什么是形态学?形态学操作可以说是基于形状的一系列图像处理操作,通过将结构元素(这里是kernal)作用于输入图像,从而得到输出图像。大都是在二值图像的基础上进行的操作。

膨胀操作类似于“领域扩张”,原二值图像中分为前景和背景,膨胀操作就是把前景区域扩大;腐蚀操作类似于“领域压缩”,图像中高亮的前景部分的区域会缩小。

以下图为例:
在这里插入图片描述

上图中左边的图像为经过otsu处理的二值mnist手写数字图像,中间的图片为经过膨胀(dilate)操作得到的前景面积更大的图像,而最右边的图像是经过腐蚀(erode)操作压缩了前景面积的图像。

如何实现腐蚀和膨胀操作?用到的操作非常类似于卷积。假如我们选定结构元素 kernel 的大小为 3x3,且所有9个位置的值都为1 ,将这个窗口在原二值图像上的每个点都进行滑动。对于膨胀操作,只要以该点为中心的 3x3 区域有一个像素为前景色(即255),那么该点对应得到的输出值就是255(前景色);相反,对于腐蚀操作,如果某个中心点周围 3x3 区域有一个点是背景色(即0),那么该点对应的输出值为0。

当然 kernel 的大小以及取值是可以改变的,理论上 kernel 的尺寸越大,或者 kernel 中 1 的个数越多,膨胀/腐蚀的效果越明显。

由此可见,腐蚀操作可以应用于消除噪声、分割一些独立的图像元素;而膨胀操作可以连接相邻的元素。

最后放一段opencv-python的代码实现:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

img_ori = cv.imread('fig.jpg')
if len(img_ori.shape) == 3:
    img_gray = cv.cvtColor(img_ori, cv.COLOR_BGR2GRAY)

th, img_bin = cv.threshold(img_gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)

kernal = np.ones((3, 3), dtype=np.uint8)
img_dilate = cv.dilate(img_bin, kernal)
img_erode = cv.erode(img_bin, kernal)

plt.subplot(131); plt.imshow(img_bin, "gray"); plt.title("img_bin")
plt.subplot(132); plt.imshow(img_dilate, "gray"); plt.title("img_dilate")
plt.subplot(133); plt.imshow(img_erode, "gray"); plt.title("img_erode")

plt.show()

参考:https://zhuanlan.zhihu.com/p/83078037?utm_source=qq&utm_medium=social&utm_oi=800732634723524608

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值