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

图像垂直线边缘提取与分析:分离、平滑及定位技术问询

原始帖子

我有一批相似的图像需要分析。

经过以下步骤:

  • 阈值处理(thresholding)
  • 使用skimage.morphology.reconstruction进行孔洞填充
  • 图像闭运算(image closing)

我得到了类似这样的图像:
输入图像描述

我关注形状的边缘,尤其是原始灰度图像中沿垂直线的坡度陡峭程度。我尝试用Canny边缘检测获取轮廓,得到了如下结果:
输入图像描述

我的问题:

  1. 如何分离近似垂直和水平的边缘?二者对我意义不同,我完全不关注相邻水平线之间的区域(更希望直接裁剪掉这些部分),但关注垂直线附近的情况(黑白图像中的白色区域)。
  2. 我认为线条应是笔直的(可能存在倾斜,但噪声过高),如何平滑轮廓线?
  3. 最终我希望回到灰度图像,查看垂直线附近的像素统计信息,如何从Canny检测到的边缘中提取线条的位置信息?

我的代码:

im_th= cv2.inRange(img, 0, 500, cv2.THRESH_BINARY)
seed = np.copy(im_th)
seed[1:-1, 1:-1] = im_th.max()
mask = im_th
filled = reconstruction(seed, mask, method='erosion').astype(np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(4,4))
closed = cv2.morphologyEx(filled,cv2.MORPH_CLOSE, kernel=kernel)
edges = cv2.Canny(cv2.medianBlur(closed, 5), 50, 150)
补充内容

根据Christoph Rackwitz和mimocha的建议,我尝试使用findContours和HoughLinesP。两种方法的结果都有前景,但仍需进一步处理才能投入使用。

findContours方法

代码:

contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contour_img = cv2.drawContours(cv2.cvtColor(closed, cv2.COLOR_GRAY2BGR), contours, -1, (255,0,0), 3)

生成图像(叠加在闭运算图像上):
输入图像描述

轮廓被很好地检测出来,但仍有151条轮廓线。我希望平滑结果并减少线条数量。

HoughLinesP方法

代码:

threshold = 15
min_line_length = 30
max_line_gap = 200
line_image = np.copy(cv2.cvtColor(closed, cv2.COLOR_GRAY2BGR)) * 0
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, threshold, None, min_line_length, max_line_gap)
for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(line_image,(x1,y1),(x2,y2),(255,0,0),5)
lines_edges = cv2.addWeighted(cv2.cvtColor(closed, cv2.COLOR_GRAY2BGR), 0.2, line_image, 1, 0)

生成图像:
输入图像描述

HoughLinesP确实能生成直线,且检测效果良好,但部分线条过“粗”(图像中可见部分粗线实际为平行线),因此需要优化结果的方法。

目前总结:

  1. 轮廓法和霍夫变换法均有成效。
  2. 霍夫变换法优势在于返回直线,且可分离水平和垂直线。
  3. 仍需线条合并/聚类的方法。

内容的提问来源于stack exchange,提问作者Yair M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 08:25:28