形态学处理腐蚀和膨胀

图像的腐蚀和膨胀都属于形态学的基本运算。什么是形态学?形态学操作可以说是基于形状的一系列图像处理操作,通过将结构元素(这里是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

发布了34 篇原创文章 · 获赞 80 · 访问量 2011

猜你喜欢

转载自blog.csdn.net/jackzhang11/article/details/104149211