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

基于Python SciKit库的图像矩形目标分割与计数方案咨询

基于scikit-image的矩形目标计数实现方案

核心技术思路

你需要的是形状特征筛选的分割方案,scikit-image内置的skimage.measure.regionprops模块可以提取连通域的全量几何属性,直接通过矩形专属的几何指标过滤掉所有非矩形干扰对象,不需要依赖blob检测。

完整处理流程(补充现有步骤的后续环节)

  • 形态学预处理:对otsu输出的二值图执行闭运算+开运算,消除矩形内部的孔洞、周围的零散噪点,使用skimage.morphology下的square/disk结构元素即可
  • 连通域标记:调用skimage.measure.label()给二值图中所有独立连通域生成唯一标签
  • 形状特征过滤:遍历所有连通域的属性,同时满足以下条件的判定为有效矩形目标:
    • 面积落在预设的目标矩形面积区间内,过滤过小噪点/过大背景块
    • 矩形度(extent) ≥ 0.85(完美矩形该值为1,可根据场景误差调整阈值)
    • 可选:纵横比落在目标矩形的比例区间内,过滤形状不符合的干扰
    • 可选:固体度(solidity) ≥ 0.9,过滤边缘有凹缺的非规则对象
  • 统计符合条件的连通域数量,即为目标矩形计数结果

参考伪代码

from skimage import io, color, filters, morphology, measure

# 已完成的前置步骤
img = io.imread("输入图像路径")
gray = color.rgb2gray(img)
thresh = filters.threshold_otsu(gray)
binary = gray > thresh
binary = morphology.clear_border(binary)

# 补充的核心处理步骤
# 1. 形态学降噪
selem = morphology.square(3)
binary_clean = morphology.closing(binary, selem)
binary_clean = morphology.opening(binary_clean, selem)

# 2. 连通域标记
label_img = measure.label(binary_clean, connectivity=2)
props = measure.regionprops(label_img)

# 3. 按形状筛选矩形
rect_count = 0
min_area = 100  # 替换为实际目标最小面积
max_area = 10000 # 替换为实际目标最大面积
min_extent = 0.85
for region in props:
    if min_area < region.area < max_area and region.extent > min_extent:
        # 可追加纵横比、solidity等过滤条件
        rect_count +=1

print(f"矩形目标总数:{rect_count}")

优化适配场景

如果存在光照不均、矩形重叠的问题,可做如下调整:

  • 光照不均:将otsu全局阈值替换为skimage.filters.threshold_local局部阈值
  • 矩形重叠:在连通域标记前增加距离变换+分水岭分割步骤,拆分粘连的矩形目标

内容的提问来源于stack exchange,提问作者Cian Darcy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:39:05