极坐标下霍夫变换后直线绘制代码的原理疑问
极坐标霍夫变换直线绘制代码拆解
先明确霍夫变换里(rho, theta)的核心含义:
rho是坐标原点到目标直线的垂直距离theta是这条垂直线(原点到直线的垂线)与x轴正方向的夹角
下面逐行拆解代码逻辑:
计算垂线方向的单位向量
a = math.cos(theta) b = math.sin(theta)因为
theta是垂线与x轴的夹角,所以(cosθ, sinθ)就是这条垂线方向的单位向量——长度固定为1,方向完全由theta决定。求原点到直线的垂足坐标
x0 = a * rho y0 = b * rho从原点出发,沿着垂线方向走
rho的长度(rho本身就是原点到直线的垂直距离),到达的点就是直线上离原点最近的点,也就是垂足(x0, y0)。生成直线上的两个端点
pt1 = (int(x0 + 1000*(-b)), int(y0 + 1000*(a))) pt2 = (int(x0 - 1000*(-b)), int(y0 - 1000*(a)))目标直线和那条垂线是垂直关系,所以直线的方向向量必须和
(a,b)垂直。数学上,(-b, a)就是满足垂直要求的单位向量:- 验证垂直:
a*(-b) + b*a = 0,点积为0说明两个向量垂直 - 验证单位长度:
(-b)² + a² = sin²θ + cos²θ = 1,长度为1
给垂足(x0,y0)加上1000*(-b, a),就是沿着直线的一个方向走1000个单位得到pt1;减去这个向量,就是沿着反方向走1000个单位得到pt2。两个点相距2000个单位,足够在常规尺寸的图像里完整显示直线。
- 验证垂直:
内容的提问来源于stack exchange,提问作者sky1099
相关产品推荐
相关产品推荐

