2015-01-05 36 views
2

有人可以幫助我弄清楚如何從這些點中的大多數(可能是20點中的5-6點)給定的一組點中繪製完美的直線?請注意,這不是線條擬合問題,但是大多數給定點之間應繪製完美的線條(水平,垂直或略傾斜)。如何繪製通過MATLAB中大多數給定點的完美直線?

這裏是MATLAB代碼:

e=[161 162 193 195 155 40 106 102 125 155 189 192 186 188 185 186 147 148 180 183]; 
 

 
f =[138 92 92 115 258 124 218 114 125 232 431 252 539 463 643 571 582 726 726 676]; 
 

 
figure;scatter(f, e, 5, 'red'); 
 

 
axis ij;

這裏是圖像: enter image description here

+3

注意:由於您處理的是有限精度,因此除非您聲明瞭一些容差 –

+1

,否則您看過RANSAC或Hough變換的絕大多數機會不超過2個點將通過任何行? – Shai

+1

有沒有任何理由爲什麼這不是一個合適的問題?你說你想讓這條線穿過大部分的點。聽起來像是一個適合我的問題...? – kkuilla

回答

4

既然你想讓這條線穿過大多數的點,這聽起來就像是一個線條擬合問題,即使你說它不是。你是否看過Theil-Sen估計量(for example this one on fex),這是一個線性迴歸,忽略了大約30%的異常值。

如果您只是想通過極值線你可以做這樣的事情:

% Setup data 
e = [161 162 193 195 155 40 106 102 125 155 189 192 186 188 185 186 147 148 180 183]; 
f = [138 92 92 115 258 124 218 114 125 232 431 252 539 463 643 571 582 726 726 676]; 
% Create scatterplot 
figure(1); 
scatter(f, e, 5, 'red'); 
axis ij; 

% Fit extrema 
[min_e, min_idx_e] = min(e); 
[max_e, max_idx_e] = max(e); 
[min_f, min_idx_f] = min(f); 
[max_f, max_idx_f] = max(f); 
% Determine largest range and draw line accordingly 
if (max_e-min_e)>(max_f-min_f) 
    line(f([min_idx_e, max_idx_e]), e([min_idx_e, max_idx_e]), 'color', 'blue') 
    text(f(max_idx_e), e(max_idx_e), ' Extrema') 
else 
    line(f([min_idx_f, max_idx_f]), e([min_idx_f, max_idx_f]), 'color', 'blue') 
    text(f(max_idx_f), e(max_idx_f), ' Extrema') 
end 

% Fit using Theil-Sen estimator 
[m, e0] = Theil_Sen_Regress(f', e'); 
line([min_f, max_f], m*[min_f, max_f]+e0, 'color', 'black') 
text(max_f, m*max_f+e0, ' Theil-Sen') 

然而,正如你會發現沒有解決方案能夠自動自動適合的點,只是因爲有太多的異常值,除非你事先過濾這些。因此,使用Shai和McMa提出的RANSAC算法可能會更好。 Line Fit Example

+0

如果你添加了這個數字,那也不錯。 – kkuilla

+0

看起來像泰爾森估計可能工作。但無法獲得這些數據的結果。我會再檢查一次。極端的代碼不是解決方案。 – erbal

+0

注意Theil-Sen估計器,因爲它站在該鏈接後面只接受列向量作爲輸入,所以在你的情況下,你必須使用'[m,e0] = Theil_Sen_Regress(f',e')'。 – hugovdberg

2

一個簡單但並不是很有效的解決方法是計算每兩個點之間的斜率和如果一組點位於一條直線上,所有這些組的對將具有相同的斜率。因此,一個算法可以選取所有具有相同斜率的點,並將它們連接在一起,如果它們有一個共同點。最後你必須選擇最大的一組。該算法的時間複雜度爲O(N^2 log N),其中N是點數。 正如我在圖中看到的那樣,沒有一條真正完美的線貫穿所有點,而是有一個容差,在這個算法中可以定義爲連接兩個對的標準。如果兩個斜率相差不到2%,我們就連接這兩對。

+1

這非常接近我的答案中提到的Theil-Sen估計量,它可以確定最佳擬合線的斜率和y相交。 – hugovdberg

3

這是RANSAC algorithm的教科書示例。用於Matlab的This free toolbox實際上有一些非常好的線擬合示例。

+0

github鏈接不起作用。 – erbal

+0

適合我......任何方式,有很多這樣的其他工具箱,甚至維基百科文章的實現:http://en.wikipedia.org/wiki/RANSAC#Matlab_Implementation – McMa

+0

無法調查RANSAC,Extrema爲我工作。 – erbal

相關問題