课程实验报告
2017 - 2018 学年第一 学期
计算机视觉及应用
电通1班 学号: 。 地点:
批改日期:
RANSAC即随机抽样一致。它可以从一组包含“局外点”的观测数据实 验 集中,通过迭代方式估计数学模型的参数。它是一种不确定的算法——目 它有一定的概率得出一个合理的结果。借助MATLAB工具,通过RANSAC的算法拟合圆,理解其原理,分析它的优点与确定。 及要 求 实验仪器设备 实验设备为一台装有win10系统的PC,matlab2015b软件。 利用圆的定义,圆是平面内到定点F1、F2的距离之和等于常数(大实验于|F1F2|)的动点P的轨迹,F1、F2称为圆的两个焦点。其数学表达式原。选取3个点,2个焦点,1个过圆理为:|PF1|+|PF2|=2a(2a>|F1F2|) 的点,就能确定圆。 有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。 用1中得到的模型去测试所有的其它数据,如果某个点适用于估计实验内容 的模型,认为它也是局内点。 如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。 然后,用所有假设的局内点去重新估计模型(譬如使用最小二乘法),因为它仅仅被初始的假设局内点估计过。 最后,通过估计局内点与模型的错误率来评估模型。
上述过程被重复执行固定的次数,每次产生的模型要么因为局内点太少而被舍弃,要么因为比现有的模型更好而被选用。 实验步骤及方法 第一步:生成随机点,本实验随机点的数量设置为300; 第二步:参数的初始化,设置圆长短轴,生成圆模型; 第三步:由圆定义,查找符合圆模型的点; 第四步:画出拟合结果; matlab程序代码: clc; clear; %% 生成 带噪声的圆 % 参数初始化 实验数据 g_NumOfPoints = 500; % 点数 g_ErrPointPart = 0.5; % 噪声 g_NormDistrVar = 3; % 标准偏差 a=20;b=20; %长轴短轴 angle=60; %倾斜角 %% 圆生成 beta = angle * (pi / 180);
alpha = linspace(0, 360, g_NumOfPoints) .* (pi / 180); X = (a * cos(alpha) * cos(beta)- b * sin(alpha) * sin(beta) )+wgn(1,length(alpha),g_NormDistrVar^2,'linear'); Y = (a * cos(alpha) * sin(beta)+ b * sin(alpha) * cos(beta) )+wgn(1,length(alpha),g_NormDistrVar^2,'linear'); Data=[X;Y]; plot(Data(1, :), Data(2, :), '.', 'Tag', 'DATA'); hold on; %% RANSAC圆拟合 %圆一般方程:Ax2+Bxy+Cy2+Dx+Ey+F=0 %F=@(p,x)p(1)*x(:,1).^2+p(2)*x(:,1).*x(:,2)+p(3)*x(:,2).^2+p(4)*x(:,1)+p(5) %% 参数初始化 nSampLen = 2; %设定模型所依据的点数 nDataLen = size(Data, 2); %数据长度 nIter = 50; %最大循环次数 dThreshold = 2; %残差阈值 nMaxInlyerCount=-1; %点数下限 A=zeros([2 1]); %B=zeros([2 1]); P=zeros([2 1]); %% 主循环
for i = 1:nIter SampleMask = zeros([1 nDataLen]); while sum( SampleMask ) ~= nSampLen % ~=不等于 ind = ceil(nDataLen .* rand(1, nSampLen - sum(SampleMask))); %抽样,选取nSampLen个不同的点 SampleMask(ind) = 1; end Sample = find( SampleMask ); %找出非零元素的索引值,即建立模型的点 %% 建立模型,存储建模需要的坐标点,焦点和过圆的一个点 %圆定义方程:到两定点之间距离和为常数 A(:,1)=Data(:,ind(1)); %圆点 % B(:,1)=Data(:,ind(2)); %焦点 P(:,1)=Data(:,ind(2)); %圆上一点 DIST= sqrt((P(1,1)-A(1,1)).^2+(P(2,1)-A(2,1)).^2); %DIST = (((P(1,1) - A(1,1)).^2) + ((P(2,1)-A(2,1)).^2); xx=[]; nCurInlyerCount=0; %初始化点数为0个 %% 是否符合模型? for k=1:g_NumOfPoints CurModel=[A(1,1) A(2,1) DIST ]; pdist=((Data(1,k)-A(1,1)).^2+(Data(2,k)-A(2,1)).^2);
CurMask =(abs(DIST-pdist)< dThreshold); %到直线距离小于阈值的点符合模型,标记为1 nCurInlyerCount =nCurInlyerCount+CurMask; %计算符合圆模型的点的个数 if(CurMask==1) xx =[xx,Data(:,k)]; end end %% 选取最佳模型 if nCurInlyerCount > nMaxInlyerCount %符合模型的点数最多的模型即为最佳模型 nMaxInlyerCount = nCurInlyerCount; Ellipse_mask = CurMask; Ellipse_model = CurModel; Ellipse_points = [A P]; Ellipse_x =xx; end end %% 由符合点拟合圆 x^2+y^2+Dx+Ey+F=0 %圆一般方程:Ax2+Bxy+Cy2+Dx+Ey+F=0 %
F=@(p,x)p(1)*x(:,1).^2+p(2)*x(:,1).*x(:,2)+p(3)*x(:,2).^2+p(4)*x(:,1)+p(5)*x(:,2)+p(6); p(1)=1; p(2)=0; p(3)=1; F=@(p,x)p(1)*x(:,1).^2+p(3)*x(:,2).^2 +p(2)*x(:,1).*x(:,2)+p(4)*x(:,1)+p(5)*x(:,2)+p(6); p0=[1 1 1 1 1 1]; x=Ellipse_x'; pr=nlinfit(x,zeros(size(x,1),1),F,p0); % 拟合系数,最小二乘方法 xmin=min(x(:,1)); xmax=max(x(:,1)); ymin=min(x(:,2)); ymax=max(x(:,2)); %% 画点作图 plot(Ellipse_points(1,:),Ellipse_points(2,:),'r*'); hold on; plot(Ellipse_x(1,:),Ellipse_x(2,:),'yo'); hold on; ezplot(@(x,y)F(pr,[x,y]),[-1+xmin,1+xmax,-1+ymin,1+ymax]); title('RANSAC圆拟合'); legend('样本点','抽取点','符合点','拟合曲线')
示例图片RANSAC拟合情况: 通过在MATLAB上仿真,得到RANSAC圆拟合图,如下所示: 实验数据分析及处理 图1 第一次运行时RANSAC圆拟合图 图2 第二次运行时RANSAC圆拟合图
图3 第三次运行时RANSAC圆拟合图 1.图1结果分析 如图1所示,随机生成了300个蓝色的点,其中局内点21个,即黄色点,局外点190个,以抽样点为圆心,拟合了一个圆。 (𝓍+13.203)2+(𝓎−11.928)2=1.2392 2. 图2结果分析 如图2所示,其中局内点11个,局外点200个,得到较好的拟合结果。 (𝓍+19.143)2+(𝓎+10.971)2=2.5212 3.图3结果分析 实如图3所示,其中局内点14个,局外点200个,得到较好的拟合验结结果。 果(𝓍+18.974)2+(𝓎+1.724)2=3.4732 分4.图1、图2、图3横向对比分析 析 图一、图二、图三,都是经过多次拟合才拟合成功。可能的原因是样本点是随机产生的,不能确定每次产生的样本点都能成功的拟合。 5.RANSAC拟合原理和流程图 建立模型时利用圆的定义方程:dist(P,A)+dist(P,B)=DIST,其中P为圆上一点,A为圆心。随机选取三点A,P构建圆模型,计算每个点到此两焦点的距离和与DIST的差值,差值小于一定阈值时的点为符合模型的点,点数最多时的模型即为最佳圆模型,再根据符合条件的点,利用圆一般方程x^2+y^2+Dx+Ey+F=0和得到符合点进行系数拟合,根据函数式画出最终拟合圆。
RANSAC本身就是一个不确定的算法,它通过不断地迭代估计出模型的参数,带有一定的随机性,不能确定地拟合圆,因而RANSAC算法稳实定性较差。另外,它计算参数的迭代次数没有上限,如果设置上限,得验总到的结果可能不是最优的结果,甚至可能得到错误的结果。但RANSAC结 也有明显的优点,它能从包含大量局外点的数据集中估计出高精度的参数。 批改意见 签名: 年 月 日
因篇幅问题不能全部显示,请点此查看更多更全内容