5.8. 漫水填充与检测图形

本节开头的几何图元在应用已知的位置处放置标记。图像合成则是将一幅图像叠放到另一幅之上。最后一小组绘制方法做的事情有所不同:它放置的标记,其形态取决于图像中已有的内容,或者某个先前算法在其中找到的内容。

5.8.1. 漫水填充

flood_fill() 从单个像素——即种子——开始,向外生长,对每一个与种子足够相似、并通过一连串其他相似像素与之相连的像素进行着色。结果是一块填充区域,其边界由图像本身决定,而非由调用时传入的任何参数决定。

最简单的形式接受种子坐标和用于填充的颜色:

img.flood_fill(x=160, y=120, color=(0, 255, 0))

两个阈值参数控制填充生长的激进程度。seed_threshold(从 0.01.0 的归一化分数)设定像素与原始种子的值相差多少时仍会被包含进来。floating_threshold 则设定像素与每个已被包含的邻居相差多少时仍被包含。这两个阈值协同工作:宽松的 floating_threshold 让填充能跨越图像跟随一个渐变,而严格的 seed_threshold 则即使沿着该渐变也能阻止填充偏离种子值太远。

还有几个标志可进一步优化结果:

  • invert=True 着色每一个匹配的像素——即匹配区域的补集——而非匹配像素本身。

  • clear_background=True 将填充区域之外的每个像素清零。这对于将填充区域单独提取为掩码很有用。

  • mask 关键字具有其惯常含义:掩码中关闭的像素将保持原样,无论填充本来是否会到达它们。

漫水填充在两种模式下最为有用。第一种是可视化某个区域检测器找到的结果,用一种独特的颜色填充检测到的区域,使其在帧的其余部分中突显出来。第二种是提取区域本身,将 clear_background=True 与区域内的一个已知种子结合,并将所得图像作为掩码用于下游操作。

5.8.2. 绘制检测结果

图像处理算法常常返回同时携带位置和某些附加结构的结果对象:带朝向的关键点、质心与边界框不同的人脸检测结果、带四个角点的 AprilTag。把这些对象绘制好——用能体现其结构而不仅仅是边界框的图形——是一种足够常见的模式,因此该模块为此提供了两个辅助方法。

draw_keypoints() 接受由特征提取器返回的关键点描述符,或者一个简单的 (x, y, rotation) 三元组列表,并在每个点处绘制一个小图形。该图形同时体现位置和朝向:围绕该点的一个圆,加上一条从中心引出的线表示旋转。这种单次调用的可视化是检查关键点提取器是否返回了应用所预期朝向的最简便方式。

draw_detection() 接受一个六元组 (rx, ry, rw, rh, cx, cy)——边界矩形加上单独报告的质心——并一次性绘制两者:围绕边界框的矩形、质心处的十字,以及可选地在矩形角处的文本标签。这种形式与神经网络检测或模板跟踪器的典型报告内容相符,其中质心给出的位置比边界框中心更精确。

这两个图形方法都是本节开头几何图元之上的便捷封装层。应用始终可以通过直接调用 draw_rectangle()draw_circle()draw_cross()draw_string() 复现相同的可视化效果;这些图形方法只是为反复出现的模式省去了记账式的繁琐工作。

有了用于已知几何形状的几何图元、用于叠加的图像合成、用于图像派生区域的漫水填充,以及用于标准可视化模式的检测图形,绘图工具集便完整了。应用需要把算法输出可视化的任何内容,都有一个相应的方法可以将其呈现出来。