遥感数字图像处理与分析 练习三¶
本次任务¶
实现连通域标记算法(8-邻域)
1 相关知识点¶
- 图像的连通域:是指图像中具有相同像素值并且位置相邻的像素组成的区域。
- 连通域分析:是指在图像中寻找出彼此互相独立的连通域并将其标记出来。
- 一般情况下,一个连通域内只包含一个像素值,因此为了防止像素值波动对提取不同连通域的影响,连通域分析通常处理的是二值化后的图像。
- 图像邻域 4-邻域:两个像素相邻必须在水平和垂直方向上相邻,相邻的两个像素坐标必须只有一位不同而且只能相差1个像素。(如下图左图所示)
- 图像邻域 8-邻域:两个像素相邻允许在对角线方向相邻,相邻的两个像素坐标在X方向和Y方向上的最大差值为1。(如上图右图所示)
2 OpenCV 介绍¶
OpenCV 是一个基于 BSD 许可(开源)发行的跨平台计算机视觉库,可以运行在 Linux、Windows、Android 和 Mac OS 操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了 Python、Ruby、MATLAB 等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV 用 C++ 语言编写,它的主要接口也是 C++ 语言,但是依然保留了大量的C语言接口。(CV:Computer Vision,计算机视觉)
3 开发环境配置¶
接下来,我们将延续 练习一 创建的虚拟环境,并在其中安装 OpenCV Python 库。
激活创建好的虚拟环境
1 |
|
安装 OpenCV Python 库
1 |
|
4 实现 4-邻域连通域标记¶
4.1 标记规则¶
源数据 (Source) | 目标数据 (Distination) |
---|---|
1 | 1 |
2 | 2 |
3 | 1 |
-
一开始被打上 1 标签的像素(即
Source=1
的像素)最终被分配到的标签 1(Distination=1
) -
一开始被打上 3 标签的像素(即
Source=3
的像素)最终被分配的的标签也为 1(Distination=1
)
4.2 算法实现¶
做 4−邻域连通域标记时,我们只用考察上方像素和左边像素
-
从图像的左上角开始进行光栅扫描
-
如果当前遍历到的像素 \(i(x,y)\) 是黑像素,则不做处理。如果是白像素,考察该像素的上方像素 \(i(x,y-1)\) 和 左边像素 \(i(x-1,y)\),如果两个的取值都为 0,则将该像素分配一个新的标签。
-
在这里我们用数字做标签,即 \(1,2,3,4,...\)
-
如果两个像素中有一个不为 0(也就是说已经分配了标签),则将上方和左边的像素分配的标签中数值较小的那一个(0 除外)分配给当前遍历到的像素 \(i(x,y)\)。在这里,将上方像素和左边像素的标签写入查找表的源数据,将当前遍历的像素 \(i(x,y)\) 分配的标签写入目标数据。
-
最后,对照查找表,对像素分配的标签由源数据变为目标数据。
4.3 代码实现¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
4.4 结果对比¶
左图是输入图像,右图为 4-邻域连通域标记 输出图像。
5 实现 8-邻域连通域标记¶
要进行 8−邻域连通域标记,我们需要考察 4 个像素:左上 \(i(x-1,y-1)\),正上 \(i(x, y-1)\),正左 \(i(x-1,y)\),左下 \(i(x+1,y-1)\) 或者右上。
5.1 代码实现¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
5.2 结果对比¶
左图是输入图像,中图为 4-邻域连通域标记输出图像,最右图为 8-邻域连通域标记 输出图像。
参考文章¶
- Py之cv2:cv2库(OpenCV,opencv-python)的简介、安装、使用方法(常见函数、方法等)最强详细攻略 - CSDN
- OpenCV—python 连通域标记 - CSDN
- 【OpenCV 4开发详解】图像连通域分析 - 腾讯云
创建日期: 2022-12-27
作者: