核心代码import numpy as np
导入随机
导入匹配
effit _ line _ by _ ran sac (point _ list,sigma,iters=1000,P=0.99 ) :
使用RANSAC算法对齐直线
#迭代最大次数iters=1000
#数据和模型公差sigma
#获得正确模型的概率P=0.99
#最佳模型的参数估计
best_a=0#线性梯度
best_b=0#直线切片
n_total=0#内点数
forIinrange(ITERS ) :
#随机选取两点求解模型
sample _ index=random.sample (range (len ) point_list,2 ) ) ) ) ) ) ) ) ) ) ) ) )。
x _1=point _ list [ sample _ index [0] [0]
y _1=point _ list [ sample _ index [0] [1]
x _2=point _ list [ sample _ index [1] [0]
y _2=point _ list [ sample _ index [1] [1]
if x_2==x_1:
continue
求# y=ax b,b
a=(y_2-y_1)/(x_2 - x_1) ) ) ) ) ) a=(y_2-y_1)
b=y_1 - a * x_1
计算#内点数
total_inlier=0
forindexinrange(len(point_list ) ) :
y _ estimate=a* point _ list [ index ] [0] b
if ABS (y _ estimate-point _ list [ index ] [1] ) sigma:
total_inlier =1
#确定当前模型是否比以前估计的模型好
if total_inlier n_total:
iters=math.log(1-p )/math.log )1-pow ) total_inlier/len ) point_list ),2 ) )
n_total=total_inlier
best_a=a
best_b=b
#确定当前模型是否适合一半以上的点
iftotal_inlierlen(point_list )//2:
布莱克
return best_a,best_b
if __name__=='__main__':
#测试
points=[ (1,3 ),5,11 ),8,18 ),9,22 ),10,19 ),19,37 ] ]
a,b=fit_line_by_ransac(points,sigma=3) ) ) ) ) ) ) ) ) ) ) )。
print(line:y=%s*x%s ) % (a,b ) ) ) ) ) ) ) ) ) ) ) )。