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

OpenCV形态学闭运算连接线段时排除外边缘空白的方法

不超出图像外边界连接离散竖直线段实现方案

现存问题

当前使用纵向矩形核的形态学闭运算连接离散竖直线段,实现代码如下:

inputImg = cv2.imread(imgPath)
grayInput = cv2.cvtColor(inputImg, cv2.COLOR_BGR2GRAY)
thre = cv2.inRange(grayInput, 0, 155)

closed = cv2.morphologyEx(thre, cv2.MORPH_CLOSE, np.ones((500,1), np.uint8))

该方案存在边界溢出问题:

  • 输入示例:
    输入图像示例
  • 当前闭运算输出(线段被错误延伸到图像上下边缘):
    当前错误输出
  • 期望输出效果(线段仅在有效范围内连接,不超出原线段的边界范围):
    期望输出效果

方案约束:

  • 禁止通过给图像添加大尺寸边距的方式解决边界问题,生产环境图像尺寸极大,加边距会带来过高内存占用,无落地可行性
  • 生产图像中存在大量带随机间隙的竖直线段,方案需要适配该通用场景

优化实现

形态学闭运算出现边界溢出的核心原因是:运算过程中会将图像边缘外的区域默认判定为背景,导致靠近边缘的线段被无限制延伸到图像边界。不需要加边距,只需要在闭运算前后增加轻量的边界约束逻辑即可解决问题,内存开销可忽略:

  1. 二值化后逐列记录该列所有竖直线段的最上端、最下端坐标,作为该列线段允许延伸的最大边界
  2. 执行原有的纵向核形态学闭运算,填充线段间隙
  3. 逐列过滤闭运算结果,将超出该列上下边界的像素全部置0,裁掉溢出的延伸段

完整可运行代码:

import cv2
import numpy as np

inputImg = cv2.imread(imgPath)
grayInput = cv2.cvtColor(inputImg, cv2.COLOR_BGR2GRAY)
thre = cv2.inRange(grayInput, 0, 155)
img_h, img_w = thre.shape

# 预存每列线段的合法上下边界,内存开销仅为2*img_w的int数组
top_pos = np.zeros(img_w, dtype=np.int32)
bottom_pos = np.zeros(img_w, dtype=np.int32)

for col in range(img_w):
    non_zero_rows = np.where(thre[:, col] > 0)[0]
    if len(non_zero_rows) == 0:
        # 该列无有效线段,标记为全0
        top_pos[col] = img_h
        bottom_pos[col] = 0
        continue
    top_pos[col] = non_zero_rows.min()
    bottom_pos[col] = non_zero_rows.max()

# 执行原有闭运算填充间隙
closed = cv2.morphologyEx(thre, cv2.MORPH_CLOSE, np.ones((500,1), np.uint8))

# 裁掉每列超出边界的溢出部分
for col in range(img_w):
    t = top_pos[col]
    b = bottom_pos[col]
    if t >= b:
        closed[:, col] = 0
        continue
    closed[:t, col] = 0
    closed[b+1:, col] = 0

方案特性

  • 内存占用极低:不需要对原图做任何padding,仅需两个长度等于图像宽度的一维数组存储边界坐标,适配GB级超大尺寸生产图像
  • 场景适配性强:完全保留原闭运算对随机间隙的填充能力,不会改变线段间隙的连接逻辑
  • 运行效率高:逐列遍历逻辑可通过numpy向量化进一步加速,整体耗时和原生闭运算基本持平

内容的提问来源于stack exchange,提问作者Naourass Derouichi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 10:54:48