一、 形态学图像处理简介
-
形态学是生物学的概念,主要研究动植物的形态和结构。
数学形态学(Mathematical morphology)是建立在集合论和拓扑学基础之上的图像分析学科。 -
图像处理中的形态学是指基于形状的图像处理操作,以数学形态学为工具从图像中提取表达和描绘区域形状的图像结构信息,如边界、骨架、凸壳等,还包括用于预处理或后处理的形态学过滤、细化和修剪等。
形态学图像处理最初用于处理二值图,进而推广到灰度级图像处理,其运算简单、效果良好。 -
形态学图像处理的运算是用集合定义的,基本运算包括:
二值腐蚀和膨胀,二值开闭运算,骨架抽取,极限腐蚀,击中击不中变换,形态学梯度,顶帽变换,颗粒分析,流域变换,灰值腐蚀和膨胀,灰值开闭运算,灰值形态学梯度等。 -
形态学的基本思想是利用结构元素测量或提取输入图像中的形状或特征,以便进行图像分析和目标识别。
形态学操作都是基于各种形状的结构元,结构元对输入图像进行操作得到输出图像。 -
在二值图像中,所有黑色像素的集合是图像完整的形态学描述。假定二值图像 A 和形态学处理的结构元素 B 是定义在笛卡儿网格上的集合,结构元素(Structuring Elements,SE)可以是任意形状,如矩形、十字形。结构元有一个锚点 O,定义为结构元的中心。
二、形态学基本操作:腐蚀
-
腐蚀和膨胀是图像处理中最基本的形态学操作,是很多高级处理方法的基础。
-
腐蚀和膨胀是对白色部分(高亮部分)而言的,膨胀就是图像中的高亮部分进行膨胀,腐蚀就是原图中的高亮部分被腐蚀。
-
腐蚀使图像中白色高亮部分被腐蚀,“邻域被蚕食”,腐蚀的效果拥有比原图更小的高亮区域,可以去掉毛刺,去掉孤立的像素,提取骨干信息。
-
腐蚀的原理是求局部最小值的操作,将 0 值扩充到邻近像素,从而扩大黑色值范围、压缩白色值范围。
-
结构元 B 对集合 A 的腐蚀定义为:
-
用卷积来描述腐蚀操作,结构元素 B 是中心为 1、其它为 0 的卷积模板(核):
(1)卷积核 B 沿着图像滑动,扫描图像 A 的每一个像素;
(2)用结构元素与其覆盖的二值图像进行 “或操作”;
(3)如果图像与卷积核对应区域的所有像素值都是 1,则图像的该像素值仍为 1;否则为 0。
三、函数
- OpenCV 提供了函数 cv.erode 可以实现图像的腐蚀。
cv.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst
函数 cv.erode 使用指定的结构元(卷积核)侵蚀源图像,结构元确定像素邻域的形状,在该邻域上取最小值:
- src:输入图像,可以为单通道或多通道,图像深度必须为 CV_8U, CV_16U, CV_16S, CV_32F 或 CV_64F
- dst:输出图像,大小和类型与 src 相同
- kernel:结构元(卷积核),null 时使用 3*3 矩形结构元素
- anchor:卷积核的锚点位置,默认值 (-1, -1) 表示以卷积核的中心为锚点
- iterations:应用腐蚀操作的次数,可选项,默认值为 1
- borderType:边界扩充的类型
- borderValue:当 borderType=BORDER_CONSTANT 时以常量 value 填充扩充边界,默认值为 (0,0,0)
四、例程
- 10.1:图像的腐蚀 (cv.erode)
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 10.1 图像的腐蚀 (cv.erode)
# 读取原始图像
imgGray = cv2.imread(r"E:/OpenCV/Fig0905a.tif", flags=0) # flags=0 读取为灰度图像
ret, imgBin = cv2.threshold(imgGray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 二值化处理
# 图像腐蚀
kSize = (3, 3) # 卷积核的尺寸
kernel = np.ones(kSize, dtype=np.uint8) # 生成盒式卷积核
imgErode1 = cv2.erode(imgBin, kernel=kernel) # 图像腐蚀
kSize = (9, 9)
kernel = np.ones(kSize, dtype=np.uint8)
imgErode2 = cv2.erode(imgBin, kernel=kernel)
kSize = (25, 25)
kernel = np.ones(kSize, dtype=np.uint8)
imgErode3 = cv2.erode(imgBin, kernel=kernel)
plt.figure(figsize=(10, 5))
plt.subplot(141), plt.axis('off'), plt.title("Origin")
plt.imshow(imgBin, cmap='gray', vmin=0, vmax=255)
plt.subplot(142), plt.title("eroded kSize=(3,3)"), plt.axis('off')
plt.imshow(imgErode1, cmap='gray', vmin=0, vmax=255)
plt.subplot(143), plt.title("eroded kSize=(9,9)"), plt.axis('off')
plt.imshow(imgErode2, cmap='gray', vmin=0, vmax=255)
plt.subplot(144), plt.title("eroded kSize=(25,25)"), plt.axis('off')
plt.imshow(imgErode3, cmap='gray', vmin=0, vmax=255)
plt.tight_layout()
plt.show()
五、资料
youcans_的博客:
https://blog.csdn.net/youcans/article/details/123225087












网友评论