我最近一直在学习霍夫变换,我相信我对它们的工作原理有很好的了解,但是我遇到了概率霍夫变换的问题。我知道它应该返回段,但我的问题是对于返回的段,有几个显然属于同一行。下面的代码主要来自 OpenCV Python 教程,做了一些修改。
从输入和输出中可以看出,出现了几段相同的行。我已经竭尽全力尝试微调程序参数(canny 选项、线长、线间距、分辨率和阈值),但无论我尝试什么,我似乎都无法获得连接的线。我知道霍夫变换使用分箱或投票系统,但我要么误解了它,要么我使用不正确。在我看来,分箱应该采用具有大致相同 rho 和 theta 的线并将它们组合在一起,因此合并这些线。
基本上这就是我想做的所有事情:保留 min x,y 和 max x,y 以便我可以合并“应该”合并的段(由一些 bin 或百分比差异决定)。如果我继续努力,我可能会找到一种复杂的方法来解决这个问题,但是有没有一种简单/更好的方法来解决这个问题?
抱歉,如果这是转发。我试图在网上找到其他资源,但大多数问题都没有解决霍夫变换的这个方面。
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()
以下是输入和输出图像: