gpt4 book ai didi

python - 使用cv2在python中在手绘图像上连接角的线

转载 作者:行者123 更新时间:2023-12-02 17:41:18 24 4
gpt4 key购买 nike

我正在寻找检测在手绘图像like this上连接角的线。我正在使用哈里斯角点检测来查找图像的角点。接下来,我将所有角线都用线连接,并遍历这些点以查看它们是否与原始图像中的像素匹配,并为每个线像素覆盖率设置一个阈值,以说是正确的连接角线。 Image of connected lines。它可以工作...但是非常慢。有更好的方法可以做到这一点,还是应该使用其他方法? (由于弯曲的可能性,粗线无法使用,我只希望连接角点的线。

for i in c_corners: #corners thru harris and coorected with subpix
x1,y1 = i.ravel()
for k in c_corners:
x2,y2 = k.ravel()
if x1 != x2 and y1 != y2: #ignore vertical lines
linePoints = line_points(x1,y1, x2,y2) # function to get line pnts
totalLinePoints = len(linePoints)
coverPoints = 0

########## This is where I think the slow down is happening and could be optimized

for m in originalImage: #image is dialated to help detection
for n in linePoints:
match = np.all(m == n)
if match == True:
coverPoints += 1
print("Line Cover = ", (coverPoints/totalLinePoints))
if (coverPoints/totalLinePoints) > .65:
good_lines.append([x1,y1,x2,y2])

感谢您的任何帮助,谢谢!

最佳答案

我的原始方法是创建一个空白图像并在其上绘制每条线,然后将cv2.bitwise_and()与二进制(膨胀的)图像一起使用以计算有多少像素一致,如果它们满足阈值,则在原始图像上绘制这些线图片。但是,为像素数设置阈值会影响小线条。一个更好的指标是正确匹配与不正确匹配的数量之比(我现在意识到这就是您实际上在做的事情)。此外,这对于扩张和您选择绘制线条的线条粗度来说更加健壮。

但是,您正在使用的一般方法对图形中的问题不是很健壮,因为合成线可能会碰到一条线段,因此像这样的合成线可能能够轻松地拟合到它们不属于的线。您可以在我的代码输出中看到此问题:

Marked lines between edges

我只是硬编码一些角估计,然后从那里去。注意,使用itertools可以帮助创建所有可能的点对来定义线段。

import cv2
import numpy as np
import itertools

img = cv2.imread('drawing.png')
bin_inv = cv2.bitwise_not(img) # flip image colors
bin_inv = cv2.cvtColor(bin_inv, cv2.COLOR_BGR2GRAY) # make one channel
bin_inv = cv2.dilate(bin_inv, np.ones((5,5)))

corners = ((517, 170),
(438, 316),
(574, 315),
(444, 436),
(586, 436))

lines = itertools.combinations(corners,2) # create all possible lines
line_img = np.ones_like(img)*255 # white image to draw line markings on
for line in lines: # loop through each line
bin_line = np.zeros_like(bin_inv) # create a matrix to draw the line in
start, end = line # grab endpoints
cv2.line(bin_line, start, end, color=255, thickness=5) # draw line
conj = (bin_inv/255 + bin_line/255) # create agreement image
n_agree = np.sum(conj==2)
n_wrong = np.sum(conj==1)
if n_agree/n_wrong > .05: # high agreements vs disagreements
cv2.line(line_img, start, end, color=[0,200,0], thickness=5) # draw onto original img

# combine the identified lines with the image
marked_img = cv2.addWeighted(img, .5, line_img, .5, 1)
cv2.imwrite('marked.png', marked_img)

我尝试了许多不同的设置(使用厚度,膨胀,不同的比率等),但无法从显示中得到那条虚假的更长的线条。不过,它非常适合原始的黑色像素,因此,我不确定如果使用此方法,您将如何摆脱它。它具有从右上角开始的曲线以及它穿过的中线,而在右下角的曲线则使该方向稍微偏斜。无论如何,这只需要两秒钟即可运行,因此至少比当前代码要快。

关于python - 使用cv2在python中在手绘图像上连接角的线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44547080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com