连通分量标记(或者称为连通分量分析、斑点提取、区域标记、斑点发现或区域提取)对图像中的连通分量进行唯一标记。标记过程逐像素扫描图像,从左上到右下,以识别连通像素区域,即共享相同强度值的相邻像素区域。例如,让我们找到此图像中的对象
要识别此图像中的对象,请使用以下命令
magick objects.gif -connected-components 4 -auto-level -depth 8 objects.png
检测到的对象被唯一标记。使用自动调平来可视化检测到的对象
对象统计信息对于审查很有用。要显示它们,请使用以下命令
magick objects.gif -define connected-components:verbose=true -connected-components 4 objects.png
在源图像中检测到五个对象,其统计信息如下
Objects (id: bounding-box centroid area mean-color): 0: 256x171+0+0 119.2,80.8 33117 srgb(0,0,0) 2: 120x135+104+18 159.5,106.5 8690 srgb(255,255,255) 3: 50x36+129+44 154.2,63.4 1529 srgb(0,0,0) 4: 21x23+0+45 8.8,55.9 409 srgb(255,255,255) 1: 4x10+252+0 253.9,4.1 31 srgb(255,255,255)
添加 -define connected-components:exclude-header=true 以显示没有标题行的对象。添加 -define connected-components:exclude-ids=true。使用 -define connected-components:sort=area | width | height | x | y 对详细的连通分量对象进行排序。默认情况下,对象按面积降序排列。添加 -define connected-components:sort-order=increasing | decreasing 以指定排序顺序。
使用 -connected-components 8 访问 8 个邻居而不是 4 个。默认情况下,邻居颜色必须完全相同才能成为唯一对象的一部分。使用 -fuzz 选项将颜色“接近”的像素包含在对象中。
您可能希望通过将其与较大的邻居合并来消除小对象。如果是这样,请使用以下命令
magick objects.gif -define connected-components:area-threshold=410 -connected-components 4 \ -auto-level objects.jpg
以下是预期结果。请注意,小对象现在如何与背景合并。
请注意,两个对象是如何合并的,只剩下三个对象
Objects (id: bounding-box centroid area mean-color): 0: 256x171+0+0 118.0,80.4 33557 srgb(0,0,0) 2: 120x135+104+18 159.5,106.5 8690 srgb(255,255,255) 3: 50x36+129+44 154.2,63.4 1529 srgb(0,0,0)
默认情况下,标记的图像为灰度。您可以改为使用源图像中的平均颜色替换标记图像中的对象颜色。只需将此设置 -define connected-components:mean-color=true 添加到您的命令行即可。
阈值可以选择包含范围,例如 -define connected-components:area-threshold=410-1600。要保留背景对象,请使用 -define connected-components:background-id=object-id 识别它。默认背景对象是面积最大的对象。
除了面积之外,还支持以下阈值指标
- connected-components:angle-threshold(来自等效椭圆)
- connected-components:circularity-threshold(4*pi*area/perimeter^2)
- connected-components:diameter-threshold(sqrt(4*area/pi))
- connected-components:eccentricity-threshold(来自等效椭圆)
- connected-components:major-axis-threshold(来自等效椭圆的直径)
- connected-components:minor-axis-threshold(来自等效椭圆的直径)
- connected-components:perimeter-threshold
您可能希望删除某些对象。使用 -define connected-components:remove-ids=list-of-ids(例如 -define connected-components:remove-ids=2,4-5)。或者使用 -define connected-components:keep-ids=list-of-ids 保留这些对象并将所有其他对象合并。为方便起见,您可以使用此选项保留顶部对象:-define connected-components:keep-top=number-of-objects。您可以改为通过颜色删除或保留对象,而不是对象 ID,例如 -define connected-components:keep-colors=red;green;blue。
图像中的对象可能看起来是同质的,但具有略微不同的颜色值。默认情况下,只有完全匹配的像素才被视为特定对象的一部分。对于对象中颜色略微变化的情况,请使用 -fuzz。例如,
magick star-map.png -fuzz 5% -define connected-components:verbose=true \ -define connected-components:mean-color=true -connected-components 4 stars.gif
连通分量
该算法以通常的行-列顺序遍历分量的像素,查找上方或左边的分量。对于左上方的分量,上方或左侧没有可以合并的分量。因此,在某些特殊情况下,您需要旋转、重复连通分量,然后旋转回来。例如
magick \ objects.gif \ -define connected-components:verbose=true \ -define connected-components:area-threshold=6000 \ -virtual-pixel None \ -connected-components 4 -rotate 180 \ -connected-components 4 -rotate -180 \ objects.png