【问题标题】:Connected line detection with opencv使用opencv进行连接线检测
【发布时间】:2021-08-22 16:16:12
【问题描述】:

我正在尝试转换如下所示的图像:

变成一个看起来像的东西(我画了这个):

我想在图像中检测并绘制线条,其中粗/薄部分被平滑以创建稍微均匀的宽度,并且如果图像中的像素接触,线条重叠。 (如果放大原始图像,您甚至可以看到细线段确实有像素连接它们)

我遇到的两个问题是:

  1. 原始图像中的薄像素部分最终会被分解。因此,转换后图像的像素不会在原始图像中重叠,从而在线条中产生间隙。
  2. 有些线条靠得很近,如果我扩大一些东西来尝试修复 #1,检测到的线条最终会在不应该重叠的地方相互重叠。

我目前正试图与 Canny/Hough 搞混以使其正常工作,但到目前为止一直没有成功。

edges = cv2.Canny(img, 50, 200, None, 3)

hough_img = np.copy(img) * 0  # creating a blank to draw lines on
lines = cv2.HoughLinesP(img, rho=1, theta=np.pi / 180, threshold=35, lines=np.array([]),
                        minLineLength=3, maxLineGap=2)
for line in lines:
    for x1, y1, x2, y2 in line:
        cv2.line(hough_img, (x1, y1), (x2, y2), (255, 0, 0), 2)

【问题讨论】:

  • Canny 是一个边缘检测器。当您想要检测线条时,检测边缘根本不是您需要做的。要检测线,请使用线检测器。要检测边缘,请使用边缘检测器。

标签: python opencv image-processing


【解决方案1】:

也许scikit-image medial_axis() 是你需要的:

from skimage.io import imread
from skimage.morphology import medial_axis

# Load image
im = imread('https://i.stack.imgur.com/cqgfc.png',as_gray=True)
skel= medial_axis(im)


或者,按照 Bart 在 cmets 中的建议,您可以使用 skeletonize()

from skimage.io import imread, imsave
from skimage.morphology import skeletonize
from skimage.filters import threshold_otsu

# Load image
im = imread('https://i.stack.imgur.com/cqgfc.png',as_gray=True)

# Get Otsu threshold
t = threshold_otsu(im)

# Binarize and skeletonize
r = skeletonize(im>threshold_otsu(im))*255

# Save
imsave('result.png',r)

【讨论】:

  • skimage.morphology.skeletonize 表示分支较少的骨架。
  • 谢谢你们,这为我解决了问题。我正在使用骨架化版本,所以感谢您的评论。
  • 最后的输出很棒:)
猜你喜欢
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 2019-12-02
  • 2019-09-28
  • 2019-03-19
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
相关资源
最近更新 更多