【问题标题】:Extract lines from image with python用python从图像中提取线条
【发布时间】:2022-01-27 15:30:46
【问题描述】:

我需要从an image 中提取路径/行。我对此输入应用拉普拉斯滤波器。在laplacian filtered image 中,要提取的线可以看作是低值像素连接形成一个线性对象,高值像素形成其边界(定义线性路径的粗细)。问题是这些线之间有更多的像素,它们也具有相似的值。设置阈值以提取这些行不起作用。应用熵或 gabor 过滤器等过滤器也不起作用。使用 HoughP 或 Hough 变换不会产生任何有意义的结果,可能是参数设置不正确。 我需要帮助从图像中提取这些线条/路径。

【问题讨论】:

  • xyproblem.info 您描述了您的方法存在问题,但目标是什么?
  • 目标是提取共享图片中的路径线。
  • @ChristophRackwitz 感谢分享link。目标确实是从共享图像中提取线条。由于即使在裁剪后太大,我也将它们作为链接附加。
  • @Rathee “提取路径线”的目标非常模糊且易于解释。在帖子中包含预期的输出很重要。现在很多事情都不清楚,例如:你期望多少行?水平线和垂直线应该连接吗?你能容忍平行线和近似重复吗?线条应该是直的还是弯曲的?输出为位图,还是包含直线起点和终点坐标的列表,还是路径上所有像素坐标的列表?

标签: python algorithm opencv filter straight-line-detection


【解决方案1】:

下面的代码在阈值图像上使用cv2.HoughLinesP() 来生成:

import cv2
import matplotlib.pyplot as plt
import numpy as np

# Threshold 
img = cv2.imread("subset_comp.tif")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, img_thr = cv2.threshold(img_gray, 150, 255, cv2.THRESH_BINARY)
fig, axs = plt.subplots(1, 2)
axs[0].set_title("Thresholded")
axs[0].imshow(img_thr, aspect="auto", cmap="gray")

# Find lines
lines = cv2.HoughLinesP(
    img_thr, rho=1, theta=np.pi / 180, threshold=128, minLineLength=600, maxLineGap=30,
)
lines = lines.squeeze()
axs[1].set_title("Grayscale with Lines")
axs[1].imshow(img_gray, aspect="auto", cmap="gray")
for x1, y1, x2, y2 in lines:
    axs[1].plot([x1, x2], [y1, y2], "r")
fig.show()

【讨论】:

  • 感谢您试一试,尽管有歧义。这行得通。但是,由于图像的大小,代码在应用于完整图像时会中断。还有一个问题,HoughP 函数参数似乎取决于输入图像。它不能用作可靠的健壮代码来获取来自不同场景(相似轮廓的图像)的路径线。还是有办法解决?
  • 当您仅提供一个零上下文的示例图像时,我们无法提供一种对大量输入图像具有鲁棒性的算法。您必须提供代表整个输入范围的图像集合以及预期结果。回答你的问题:也许有办法解决它,也许没有。如果您没有足够的数据,就无法知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2019-10-15
  • 2013-06-17
  • 1970-01-01
相关资源
最近更新 更多