虚线图像中的Opencv跟踪线

2024-04-19 16:51:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下图片:命名为“normalized.png”。我试图从虚线中画实线

我尝试过类似hough线变换的方法:

import cv2
import numpy as np

img = cv2.imread('Normalised.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
for x1,y1,x2,y2 in lines[0]:
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

cv2.imwrite('houghlines5.jpg',img)

但由于未检测到“边缘”,因此代码在“边缘”上似乎失败

输入图像

first

预期输出图像

enter image description here

如何实现此输出


Tags: importimgpngnpcv2边缘linesx1
2条回答

一个可能的方案(尽管整个任务似乎非常紧迫):

  • 选择少量均匀分布的方向(如5)

  • 在各个方向

    • 在该方向平滑(f.i.具有非常细长的高斯曲线)或

    • 在该方向腐蚀(使用线性结构元素),或两者都腐蚀,以便更好地连接点

    • 使用阈值进行二值化,使点接触

    • 应用形态加厚以获得细黑线

  • 合并所有获得的贴图(最大操作)

  • 清理

默认情况下,HoughLinesP适用于直线。但是,您可以使用cv2检测曲线

img = cv.imread("Dilate.png")

gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 150, 200, apertureSize=3)
cv.imwrite("Canny.png", edges)
element = cv.getStructuringElement(cv.MORPH_RECT, (5, 3), (-1, -1))
dilated = cv.dilate(edges, element)
cv.imwrite("Eroded.png", dilated)

minLineLength = 200
maxLineGap = 5

lines = cv.HoughLinesP(dilated, cv.HOUGH_PROBABILISTIC, np.pi/180, 150, minLineLength, 
                       maxLineGap)

for x in range(0, len(lines)):
    for x1, y1, x2, y2 in lines[x]:
        pts = np.array([[x1, y1], [x2, y2]], np.int32)
        cv.polylines(img, [pts], True, (0, 255, 0))

cv.imwrite('dilate_final.png', img)

注意线条是如何绘制的

结果不完全是你们想要的,但接近,并要求你们调整参数,我将留给你们。希望有帮助

Result

相关问题 更多 >