You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术求助:二值图像黑色形状数量统计及分割算法咨询

二值图像黑色形状计数:连通域标记算法详解

嘿,我来帮你梳理下这个用于统计二值图像中黑色形状数量的算法逻辑——它本质是用**深度优先搜索(DFS)**实现的连通域标记方案,具体拆解如下:

核心思路

这个算法通过遍历图像的每一个像素,对每个未被标记的黑色像素(值为0)启动一次区域标记:把整个连通的黑色形状所有像素都替换成同一个唯一的标记值,每完成一次标记就代表找到了一个新的黑色形状,最终val-1的数值就是黑色形状的总数量。

算法伪代码实现

val = 1
for x = 1 to 列数
    for y = 1 to 行数
        if image(x,y) == 0 /* 检测到未标记的黑色形状像素 */
            segment(image, val, x, y)
            val = val + 1

function segment(image, val, x, y)
    image(x,y) = val /* 将当前像素标记为val */
    for i = -1 to 1
        for j = -1 to 1
            /* 检查邻域内的像素是否为未标记的黑色像素 */
            if image(x+i, y+j) == 0
                segment(image, val, x+i, y+j)
end function

关键细节解释

  • 初始化标记值val=1:用这个变量给每个独立的黑色形状分配唯一的标记,从1开始是为了和黑色像素的0值区分开,避免混淆。
  • 双层遍历图像:按列(x)、行(y)的顺序逐个检查像素,确保不会遗漏任何一个未标记的黑色区域。
  • DFS递归标记连通域:segment函数是核心,它会把当前像素标记后,遍历其8邻域(周围3x3的所有像素),只要邻域内还有未标记的黑色像素,就继续递归标记,直到整个连通的黑色形状都被标记为同一个val值。
  • 计数逻辑:每完成一次segment调用,val就自增1,最终val-1就是黑色形状的总数(因为初始val是1,第一次标记后val变成2,对应1个形状)。

注意事项

  • 原伪代码没有处理图像边界判断,实际开发时必须检查x+i和y+j是否在图像的行列范围内,否则会出现数组越界的错误。
  • 这里默认是8连通域判断(斜向相邻的像素也算同一形状),如果需要4连通(仅上下左右相邻),只需把邻域遍历改成只检查(0,1)、(0,-1)、(1,0)、(-1,0)这四个方向即可。

内容的提问来源于stack exchange,提问作者Tzvi Vasserman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:10:38