1. 程式人生 > >最小二乘橢圓擬合matlab程式碼實現

最小二乘橢圓擬合matlab程式碼實現

function Re = EllipseDirectFit(XY);
%  Direct ellipse fit, proposed in article
%    A. W. Fitzgibbon, M. Pilu, R. B. Fisher
%     "Direct Least Squares Fitting of Ellipses"
%     IEEE Trans. PAMI, Vol. 21, pages 476-480 (1999)
%
%  Our code is based on a numerically stable version
%  of this fit published by R. Halir and J. Flusser
%
%     Input:  XY(n,2) is the array of coordinates of n points x(i)=XY(i,1), y(i)=XY(i,2)
%
%     Output: A = [a b c d e f]' is the vector of algebraic 
%             parameters of the fitting ellipse:
%             ax^2 + bxy + cy^2 +dx + ey + f = 0
%             the vector A is normed, so that ||A||=1
%
%  This is a fast non-iterative ellipse fit.
%
%  It returns ellipses only, even if points are
%  better approximated by a hyperbola.
%  It is somewhat biased toward smaller ellipses.
%
centroid = mean(XY) ; % the centroid of the data set
warning off;
D1 = [(XY(:,1)-centroid(1)).^2, (XY(:,1)-centroid(1)).*(XY(:,2)-centroid(2)),...
      (XY(:,2)-centroid(2)).^2];
D2 = [XY(:,1)-centroid(1), XY(:,2)-centroid(2), ones(size(XY,1),1)];
S1 = D1'*D1;
S2 = D1'*D2;
S3 = D2'*D2;
T = -inv(S3)*S2';
M = S1 + S2*T;
M = [M(3,:)./2; -M(2,:); M(1,:)./2];
[evec,eval] = eig(M);
cond = 4*evec(1,:).*evec(3,:)-evec(2,:).^2;
A1 = evec(:,find(cond>0));
A = [A1; T*A1];
A4 = A(4)-2*A(1)*centroid(1)-A(2)*centroid(2);
A5 = A(5)-2*A(3)*centroid(2)-A(2)*centroid(1);
A6 = A(6)+A(1)*centroid(1)^2+A(3)*centroid(2)^2+...
     A(2)*centroid(1)*centroid(2)-A(4)*centroid(1)-A(5)*centroid(2);
A(4) = A4;  A(5) = A5;  A(6) = A6;
A = A/norm(A);
Re=A;
a=A(1);
b=A(2);
c=A(3);
d=A(4);
e=A(5);
f=A(6);
eq0= 'a*x^2 + b*x*y + c*y^2 +d*x + e*y + f ';
 
[email protected]
(x,y) a*x^2 + b*x*y + c*y^2 +d*x + e*y + f;
 h=ezplot(eq0,[1,128,1,128]);
set(h,'Color','y');
end  %  EllipseDirectFit



相關推薦

橢圓matlab程式碼實現

function Re = EllipseDirectFit(XY); %  Direct ellipse fit, proposed in article %    A. W. Fitzgibbon, M. Pilu, R. B. Fisher %     "Direct

曲線matlab實現

clear; close all;%% sample x_all = 0:0.1:10; [y_truth_all,y_all]=unknown_model1(x_all); N = length(x_all); %use the first half for training x = x_all(1:N/2

matlab練習程序(多項式

相關 sum 因此 使用 val fit width clas height 最近在分析一些數據,就是數據擬合的一些事情,用到了matlab的polyfit函數,效果不錯。 因此想了解一下這個多項式具體是如何擬合出來的,所以就搜了相關資料。 這個文檔介紹的還不錯,我估計

乘法曲線原理與實現

最小二乘學習法是對模型的輸出和訓練集輸出的平方誤差為最小時的引數進行學習,式中之所以加上係數1/2,是為了約去對進行微分時得到的2。 “LS”是Least Squares的首字母。平方誤差是殘差的範數,因此最小二乘學習法有時也稱為損失最小化學習法。

乘法直線及其Matlab實現

 最小二乘法,通常用在我們已知數學模型,但是不知道模型引數的情況下,通過實測資料,計算數學模型,例如,在題目中,數學模型就是直線方程y=ax+b,但是不知道直線方程的a和b。     本來呢,我們只需要兩組(xi,yi),就可以解得a和b,但是由於實測資料都存在誤差,所以,

乘法的原理

一. 最小二乘法的擬合原理 根據《數學指南》書中的解釋: 圖2 《數學指南》中對最小二乘法的解釋 上面這段話,枯燥且無趣,大家不用厭惡,數學向來這個樣子。 現在,我們來慢慢認識上面這段話的意思,這句話的意思是說,擬合有兩個前提: 1. 要有N個不同的點(x1,x2...xN

哈工大《機器學習》乘法曲線——實驗一

程式碼更多細節待更新。 目標: 掌握最小二乘法求解(無懲罰項的損失函式)、掌握加懲罰項(2範數)的損失函式優化、梯度下降法、共軛梯度法、理解過擬合、克服過擬合的方法(如加懲罰項、增加樣本) 已完成的要求: 生成資料,加入噪聲; 用高階多項式函式擬合曲線; 用解

Delphi實現直線和圓的承法

  在工程計算中,經常會遇到資料的擬合處理,擬合處理用的最多的是最小二承法。我曾經做過一個數據處理的軟體,其中用到了直線和圓的最小二承法擬合算法,是用delphi實現的,現將原始碼貼出來。 一直線擬合 { 直線的方程為形式:y=k*x+b ,x=c; X,y為需要處理的資料

opencv for python (18) 邊界矩形、外接圓、橢圓、直線

函式cv2.boundingRect返回四個引數(x,y)為矩形左上角的座標,(w,h)是矩形的寬和高。 函式cv2.rectangle是繪製矩形函式 函式cv2.minAreaRect返回的是一個 Box2D 結構,其中包含 矩形左上角角點的座標(x,y

關於Matlab中的線性與非線性

1、線性最小二乘擬合 最小二乘法(又稱最小平方法)是一種數學優化技術,其通過最小化誤差的平方和尋找資料的最佳函式匹配。利用最小二乘法可以簡便地求得未知的資料,並使得這些求得的資料與實際資料之間誤差的平方和為最小。最小二乘法通過變數的資料來描述變數之間的相互關係。例如通過描述

(九)次曲線

.fig pac atp matrix plot .text Coding 運算 提取數據 1 #coding=utf-8 2 from numpy import * 3 import numpy as np 4 import matplotlib.pyplo

有用 初始 等於 計算 合成 mage RR 周期性 () 來自:某小皮 最優化函數庫Optimization 優化是找到最小值或等式的數值解的問題。scipy.optimization子模塊提供函數最小值,曲線擬合和尋找等式的跟的有用算法。 最小二乘擬合 假設有一組實驗數

halcon之直線

如果不瞭解最小二乘演算法 請先閱讀: Least squares的演算法細節原理https://en.wikipedia.org/wiki/Least_squares 通常在halcon中擬合直線會用houghline或者 fitline。本文提供一種新的選擇,用halcon的矩陣操作

RANSAC與 通俗講解

一、RANSAC理論介紹 普通最小二乘是保守派:在現有資料下,如何實現最優。是從一個整體誤差最小的角度去考慮,儘量誰也不得罪。 RANSAC是改革派:首先假設資料具有某種特性(目的),為了達到目的,適當割捨一些現有的資料。 給出最小二乘擬合(紅線)、RANSAC(綠線)對於一階直線、二階

3D點雲法向量估計(平面)

1、點雲法向量估計的主要思路是對K-近鄰的N個點進行平面擬合(平面過N點重心),平面法向量即為所求; 2、最小二乘擬合可以轉換為求協方差矩陣最小特徵值對應的特徵向量(SVD分解);此種解法對資料噪聲有很強的魯棒性,關鍵點在於要對資料去中心化處理,將座標原點移動到資料重心。 3、最後根據特徵點P到重心Oi形成的

Andrew Ng機器學習筆記2——梯度下降法and

今天正式開始學習機器學習的演算法,老師首先舉了一個例項:已知某地區的房屋面積與價格的一個數據集,那麼如何預測給定房屋面積的價格呢?我們大部分人可以想到的就是將畫出房屋面積與價格的散點圖,然後擬合出價格關於面積的曲線,那麼對於一個已知的房屋面積,就可以在擬合的曲線上得到預測的

(矩陣)

最小二乘公式 B=(XTX)−1XTY 其中, B:n×1矩陣 X:m×n矩陣,輸入變數/特徵 Y:m×1矩陣,輸出變數/目標變數 m:樣本數 n:特徵個數 推導: given:XB=Y →XTXB=XTY →B=(XTX)−1XTY

OpenCV 方法求取直線傾角

工業相機拍攝的影象中,由於攝像質量的限制,影象中的直線經過處理後,會表現出比較嚴重的鋸齒。在這種情況下求取直線的傾角(其實就是直線的斜率),如果是直接選取直線的開始點和結束點來計算,或是用opencv自帶的哈夫曼直線方法,都會引起較大的角度偏差,一般會達到好幾度。誤差這

空間直線

空間直線標準方程: 轉化為射影式方程: 可以對兩個方程分別進行擬合。 令: 其中 求出a,b,c,d即可。 程式碼如下: data = load('data.txt'); data = da

非線性函式的及在Jupyter notebook中輸入公式 [原創]

突然有個想法,利用機器學習的基本方法——線性迴歸方法,來學習一階RC電路的階躍響應,從而得到RC電路的結構特徵——時間常數τ(即R*C)。回答無疑是肯定的,但問題是怎樣通過最小二乘法、正規方程,以更多的取樣點數來降低訊號採集噪聲對τ估計值的影響。另外,由於最近在搗鼓Jupyter和numpy這些東西,正好嘗試