2013-04-14 47 views
0

我有許多點排列在一個統一的網格狀時尚的集合。鑑於這些觀點,我如何檢測這個網格的屬性,比如它的旋轉,線條之間的間距等?如果有一些算法來擬合這些數據的許多平行和垂直線,那麼我可以平均線之間的距離,角度等等。做這個的最好方式是什麼?檢測網格方向和屬性

UPDATE: 我正在處理的數據看起來大致是這樣的:

enter image description here

這將是未來的清潔,但我只是需要一些方法來插值和分析網格狀圖案。

+0

網格是什麼樣子?如果它是矩形的,那麼解決方案將更容易。 – Justin

+0

它確實是矩形的。我正在處理的數據看起來像這樣 http://www-personal.umich.edu/~schmatz/grid。jpg – schmatz

+0

如果您實際上可以對網格進行形狀設置並確保其爲矩形,則左上角的點將是距離原點最近的距離(假定爲圖像的左上角)。右下角的點將是距離原點最遠的距離。你可以在這兩點之間形成一條線;離這條線最遠的點將是網格中的左下或右上點。用這些點可以計算網格的旋轉。你可以看到我是如何在我的答案中使用這個:http://stackoverflow.com/questions/15604485/sorting-2d-points-into-a-matrix/15604867#15604867 – Justin

回答

1

如果點被放置在一個網格,然後2個點之間的平方距離是 d ² ×( ²   +   Ñ ²)其中 d是網格常數(假設它是一個在兩個主方向上具有相同常數的二維矩形網格)和 m, n是定義兩點之間(仿射)差的整數(或者更簡單地說,兩個點之間的網格間隔的數量沿着「x」和「y」點軸)因此:

  • 計算點與所有其他點之間的平方距離;他們將到最低限度一個
  • ,你會得到有理數,讓您有預兆電網不斷 d和相對的「座標」ñ
+0

謝謝!這真的應該有所幫助。 – schmatz

0

如果您只有網格圖像,您可以嘗試使用「圖像處理工具箱」中的radon函數。它會給你角度和氡的變換,你可以重新計算圖像上的點之間的距離。

下面是一個代碼樣本radon功能

% First we generate a grid of points on image 
ImgW  = 400; 
ImgH  = 300; 
DIdx     = ImgH + round(rand(1)*ImgH/10); 
ImgGrid     = zeros(ImgH,ImgW); 
ImgGrid(1:DIdx:end)  = 1; 

% Then we calculate radon transform 
theta     = 0:0.1:180; 
[R,xp]     = radon(ImgGrid,theta); 

% Then we calculate standard deviation for each angle of R 
Rstd     = std(R); 
% and find maximal value of std(R) columnwise 
[RstdMax,RstdIdx]  = max(Rstd); 
ThMax     = theta(RstdIdx); 

% Now we show results 
figure('Color','w'); 
subplot(2,2,1);  imshow(ImgGrid); 
        axis on; 
        colormap(hot(255)); 
        title('Grid image'); 
        line(ImgW/2+[-1 +1]*min(ImgW,ImgH)/2*cosd(-ThMax), ... 
          ImgH/2+[-1 +1]*min(ImgW,ImgH)/2*sind(-ThMax), 'Color','y'); 
subplot(2,2,3);  plot(xp,R(:,RstdIdx),'.-'); 
        title(sprintf('Profile at %.2f deg (the yellow line)',ThMax)); 

subplot(2,2,2);  imagesc(log10(R+1), 'Xdata',theta, 'Ydata',xp); 
        axis on; 
        colormap(hot(255)); 
        xlabel('\theta (degrees)'); 
        ylabel('x'''); 

subplot(2,2,4);  plot(theta,Rstd,'.-'); 
        title('std(R)'); 

在一般情況下,這不會給你晶格矢量網格!這隻會給你點之間的距離,而不是。如果你需要格矢量,你必須重新計算它們。但如果你足夠幸運並且你的格子是長方形的......希望你得到了點; o)

如果你有點(x,y)的座標,你甚至會更幸運。 CST-Link提出的方法有些「太蠻力」。我寧願計算你的觀點的「結構因素」(參見http://en.wikipedia.org/wiki/Structure_factor和文章末尾的教程鏈接),並分析它的最大值。

+0

謝謝!我會看看這:) – schmatz