我最近一直在学习Hough变换,我相信我对它们的工作方式有很好的把握,但我遇到了概率Hough变换的问题。我知道它应该返回段,但我的问题是,对于返回的段,几个明显属于同一行。下面的代码主要来自OpenCV Python教程,并进行了一些编辑。
从输入和输出中可以看出,出现了相同行的几个段。我已经用尽我的努力来微调程序参数(精确选项,线长,线间隙,分辨率和阈值),但无论我尝试什么,我似乎都无法连接线。我知道霍夫变换使用分箱或投票系统,但我要么误解它,要么我错误地使用它。对我来说,似乎binning应该采用具有大致相同的rho和theta的线并将它们组合在一起,因此合并线条。
基本上就是我想要做的就是:保持min x,y和max x,y以便我可以合并"应该"合并(由一些箱子或百分比差异决定)。如果我继续推进,我可能会找到一种复杂的方法来解决这个问题,但是有一种简单/更好的方法来解决这个问题吗?
很抱歉,如果这是转贴。我试图在网上找到其他资源,但大多数问题都没有解决Hough变换的这个方面。
import cv2
import numpy as np
import math
from matplotlib import pyplot as plt
img = cv2.imread('hough_test.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(img,50,200,apertureSize = 3)
minLineLength = 250
#maximum allowed distance bewteen two points on a line to count them as connected
maxLineGap = 10
#will return several segments of the same line
lines = cv2.HoughLinesP(edges,1,np.pi/180,80,minLineLength,maxLineGap)
edges=np.dstack((edges,edges,edges))
i=0
theta = np.zeros(lines.shape[0])
for x1,y1,x2,y2 in lines[:,0]:
theta[i] = math.atan2(y2-y1,x2-x1)
cv2.line(edges,(x1,y1),(x2,y2),(0,0,255),2)
i+=1
print sorted(theta)
plt.show()
cv2.namedWindow('frame',0)
cv2.imshow('frame',edges)
cv2.namedWindow('frame1',0)
cv2.imshow('frame1',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
以下是输入和输出图像: