我有许多点的集合,以统一的网格状排列。鉴于这些要点,我如何检测此网格的属性,例如它的旋转,线之间的间距等?如果有一些算法可以将许多平行和垂直线拟合到这个数据,那么我可以平均线,角度等之间的距离,等等。这样做的最佳方式是什么?
更新 我正在使用的数据大致如下:
将来会更清洁,但我只需要一些方法来插入和分析网格就像模式。
答案 0 :(得分:1)
如果点放在网格上,则2点之间的平方距离 d 2×( m + n )其中 d 是网格常数(假设它是在两个主方向上具有相同常数的2D矩形网格),并且 m , n 是定义两点之间(仿射)差异的整数(或者更简单,沿“x”和“y”轴的两点之间的网格间隔数)所以:
答案 1 :(得分: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和文章末尾的教程链接)并分析了它的最大值。
答案 2 :(得分:0)
如果你有每个点的坐标,事情可能就不那么复杂了。
在这些坐标上执行 PCA 可能是个好主意。 第一个主成分将是网格较长边的轴,第二个主成分将是较短边的轴。
使用这些新轴,您可以沿主轴运行 sweep-line algorithm,这将允许您为每个点分配一个行号。沿第二个轴再次扫描将允许您分配列号。