网站菜单

OpenCV学习笔记(4)——形态学操作

形态学(morphology)一词通常表示生物学的一个分支,该分支主要研究动植物的形态和结构。而我们图像处理中指的形态学,往往表示的是数学形态学。下面一起来了解数学形态学的概念。

数学形态学(Mathematical morphology) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等。

膨胀与腐蚀能实现多种多样的功能,主要如下

  • 消除噪声
  • 分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
  • 寻找图像中的明显的极大值区域或极小值区域
  • 求出图像的梯度

1.图像腐蚀

腐蚀就是求局部最小值的操作。就像土壤侵蚀一样,这个操作会把前景物体的边界腐蚀掉(但是前景仍然是白色)。

这是怎么做到的呢?卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为零。  

黄色为当前点,红色为卷及核范围

这会产生什么影响呢?根据卷积核的大小靠近前景的所有像素都会被腐蚀掉(变为0),所以前景物体会变小,整幅图像的白色区域会减少。

这对于去除白噪声很有用,也可以用来断开两个连在一块的物体等。  

#img2 = cv2.erode(img1, kernel, iterations)
#kernel:卷积核
#iterations:迭代次数,默认为1

#先用numpy生成一个5行5列的数组作为卷积核,里面的值为1
kernel = np.ones((5, 5), np.uint8)

img2 = cv2.erode(img1, kernel, iterations = 9)

2.图像膨胀

相反,膨胀就是求局部最大值的操作。

按数学方面来说,膨胀或者腐蚀操作就是将图像(或图像的一部分区域,我们称之为A)与核(我们称之为B)进行卷积。一般都会把腐蚀和膨胀对应起来理解和学习。

图像被腐蚀后,去除了噪声但是会压缩图像。对腐蚀后的图像进行膨胀,可以去除噪声并保持原有形状
#img2 = cv2.dilate(img1, kernel, iterations)

kernel = np.ones((5, 5), np.uint8)
img2 = cv2.lidate(img1, kernel, 5)

3.开运算

先腐蚀后膨胀的过程称为开运算。用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。

https://blog.csdn.net/hanshanbuleng/article/details/80657148
#img2 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
#cv2.MORPH_OPEN:开运算

kernel = np.ones((5, 5), np.uint8)
img2 = cv2.morphologyEx(img1, cv2.MORPH_OPEN, kernel)
  1. 开运算能够除去孤立的小点,毛刺和小桥,而总的位置和形状不便。
  2. 开运算是一个基于几何运算的滤波器。
  3. 结构元素大小的不同将导致滤波效果的不同。
  4. 不同的结构元素的选择导致了不同的分割,即提取出不同的特征。

4.闭运算

先膨胀后腐蚀。有助于关闭前景物体内部的小孔,或物体上的小黑点。

https://blog.csdn.net/hanshanbuleng/article/details/80657148
#img2 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
#cv2.MORPH_CLOSE:闭运算

kernel = np.ones((5, 5), np.uint8)
img2 = cv2.morphologyEx(img1, cv2.MORPH_CLOSE, kernel)
  1. 闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变。
  2. 闭运算是通过填充图像的凹角来滤波图像的。
  3. 结构元素大小的不同将导致滤波效果的不同。
  4. 不同结构元素的选择导致了不同的分割。

5.图像梯度

对原始图像分别进行膨胀与腐蚀,用膨胀结果减去腐蚀结果可以获得图像物体的轮廓。梯度 = 膨胀-腐蚀

#img2 = cv2.morphologyEx(img1, cv2.MORPH_GRADIENT, kernel)
#cv2.MORPH_GRADIENT:梯度

img2 = cv2.morphologyEx(img1, cv2.MORPH_GRADIENT, kernel)

6.图像礼帽

对原始图像进行开运算,用原图像减去开运算结果可以获得噪声图像。礼帽图像 = 原始图像-开运算图像

#img2 = cv2.morphologyEx(img1, cv2.MORPH_TOPHAT, kernel)
#cv2.MORPH_TOPHAT:梯度

img2 = cv2.morphologyEx(img1, cv2.MORPH_TOPHAT, kernel)

7.图像黑帽

对原始图像进行开运算,用原图像减去闭运算结果可以获得内部噪声图像。礼帽图像 = 原始图像-闭运算图像

#img2 = cv2.morphologyEx(img1, cv2.MORPH_BLACKHAT, kernel)
#cv2.MORPH_BLACKHAT:梯度

img2 = cv2.morphologyEx(img1, cv2.MORPH_BLACKHAT, kernel)
  • MORPH_OPEN开运算
  • MORPH_CLOSE闭运算
  • MORPH_ERODE腐蚀
  • MORPH_DILATE膨胀
  • MORPH_GRADIENT图像梯度
  • MORPH_TOPHAT顶帽
  • MORPH_BLACKHAT黑帽
显示评论 (0)

文章评论

相关推荐

Yolov5_Seg输出解析

通过矩阵乘法(在代码中称为“matmul”)来计算分割掩码的原因,主要与实例分割网络(例如 YOLOv5 Segmentation)的实现方式有关。这种方法实际上是一种高效的特征图与目标分割系数组合的…

Ubuntu交叉编译Python

在 Ubuntu 上交叉编译 Python 的流程通常用于为不同平台生成可执行文件(如 ARM、MIPS 等)。以下是一般的操作步骤: 1. 安装必要的依赖工具 首先,确保已经安装了编译所需的工具和依…