在这篇文章中,我们将学习如何使用 Python 中的 OpenCV 来实现连通分量标记和分析。
分量标记基本上是从原始图像中提取区域,不同的是,我们试图找到的那些分量必须是“连通”的,这一点是通过应用图论来确定的。
OpenCV 为我们提供了以下 4 个函数来完成这项任务:
- cv2.connectedComponents
- cv2.connectedComponentsWithStats
- cv2.connectedComponentsWithAlgorithm
- cv2.connectedComponentsWithStatsWithAlgorithm
后两个函数效率更高、速度更快,但只有在启用了 OpenCV 并行预处理时才能运行,否则更明智的做法是坚持使用前两个。第一种和第二种方法基本相同,只是正如其名,第二种方法为我们提供了每个分量的统计信息,我们将使用第二种方法,因为在大多数情况下,你都需要用到这些统计数据。
在这个程序中,我们将使用一张横幅图片来提取文本分量,下图展示了我们程序的最终输出结果:
安装依赖项
让我们先安装必要的包:
$ pip install opencv-contrib-python
步骤 1:图像加载与预处理
让我们首先加载图像并将其转换为灰度图,这会使算法效率更高、结果更准确。之后,我们还将应用 7×7 的高斯模糊,这有助于去除不需要的边缘,并帮助我们更清晰地进行分割,这是我们下一步要做的。
Python3
CODEBLOCK_0c58b0b6
步骤 2:阈值处理
阈值处理是一种非常基础的图像分割技术,它帮助我们分离背景和我们感兴趣的前景对象。应用模糊之后,我们将使用 cv2.threshold 函数进行图像分割。
Python3
CODEBLOCK_a690ba0c
步骤 3:应用分量分析方法
我们首先应用 cv2.connectedComponentsWithStats,然后将其返回的值解包到不同的变量中,这些变量将在接下来的步骤中使用,此外让我们创建一个新数组来存储我们找到的所有分量。
Python3
CODEBLOCK_61cdb675
现在我们有了分量和分析数据,让我们遍历每个分量并筛选出有用的分量。
步骤 4:筛选有用的分量
让我们遍历每个分量,并使用在上一步中获得的统计数据来筛选出有用的分量。例如,在这里我使用了面积值来仅筛选出图像中的字符。筛选出分量后,我们将使用 labelids 变量为当前遍历的分量创建一个掩码,并对该掩码执行 bitwiseor 操作以生成我们的最终输出。这听起来可能有点难,但当你亲自实现代码后,你会更好地理解它。
Python3
CODEBLOCK_865e2f6c
如何为筛选选择 Area(或其他任何条件,如宽度或高度)的值?
添加一个打印语句来打印你想作为条件使用的统计值,然后对于有用的分量,记下这些数值的范围,并用它们来创建筛选条件。
步骤 5:可视化最终输出
现在我们的最后一步是简单地显示我们的原始图像和我们获得的最终掩码。
Python3
CODEBLOCK_4ef9cfeb
以下是完整的实现代码:
Python3
“
import cv2
import numpy as np
Loading the image
img = cv2.imread(‘Images/img5.png‘)
preprocess the image
grayimg = cv2.cvtColor(img , cv2.COLORBGR2GRAY)
Applying 7×7 Gaussian Blur
blurred = cv2.GaussianBlur(gray_img, (7, 7), 0)