我在看OpenCV的cv2.HoughLines()文档,文档中引用了多尺度霍夫变换。经典霍夫变换和多尺度霍夫变换之间的区别是什么?
cv2.HoughLines()
jckbn6z71#
首先,您需要了解Hough变换算法的一般工作原理。从您的问题中,我们不清楚您对该算法的熟悉程度。如果需要,我建议阅读以下内容:1.算法的描述,参考您在问题中提到的opencv文档:Hough Transform。
cv::HoughLines
rho
theta
threshold
多尺度版本增加了以下内容,以形成一个迭代过程:
srn
stn
min_theta
max_theta
rho/srn
theta/stn
cv::HoughLinesP
1条答案
按热度按时间jckbn6z71#
首先,您需要了解Hough变换算法的一般工作原理。从您的问题中,我们不清楚您对该算法的熟悉程度。
如果需要,我建议阅读以下内容:
1.算法的描述,参考您在问题中提到的opencv文档:Hough Transform。
简而言之,经典算法由以下元素组成(为方便起见,所有Angular 均以度而非弧度表示):
1.一条直线的参数化是它与原点的垂直距离(ρ- rho)和这条垂直线形成的Angular (θ- theta)。
cv::HoughLines
的rho
和theta
参数实际上决定了ρ和θ的分辨率。由于距离受图像对角线大小的限制,Angular 为0..180,我们可以创建一个所有距离和Angular 组合的矩阵(根据分辨率)。这称为累加器。例如:如果图像对角线为100,
rho
参数为20,我们将在矩阵中得到以下ρ值:0,20,40,60,80,100。这同样适用于Angular 。累加器矩阵中的每个单元代表一条势线(具有特定的ρ,θ)。1.输入图像必须是一个二进制掩码。我们遍历所有“点亮”的像素。每个像素可以属于多条线(根据不同的ρ和θ)。我们增加累加器中与这些线对应的每个单元格。这就像投票给它。
1.最后,我们选择投票数最高的行(取决于
threshold
)作为输出。多尺度版本增加了以下内容,以形成一个迭代过程:
srn
参数确定距离分辨率的除数,而不是对ρ应用单一分辨率。1.类似地,
stn
参数确定Angular 分辨率的除数,而不是对θ应用单个分辨率。1.还有
min_theta
和max_theta
参数可以限制我们跟踪的Angular 范围。一般来说,多尺度版本可以提供更好的结果(由于尝试了更多的分辨率),但代价是计算量更大。
我还没有找到关于这个迭代过程的确切方法的正式文档。
但从opencv源代码中的注解来看,似乎至少完成了2次迭代:一个粗略(
rho
和theta
)和一个精细(rho/srn
和theta/stn
)。我建议您尝试这两种方法,并比较特定情况下的结果质量和处理时间。
请注意,还有一个概率版本-参见
cv::HoughLinesP