我有许多点的集合,以统一的网格状方式排列。鉴于这些点,我如何检测该网格的属性,例如它的旋转、行间距等?如果有一些算法可以为这些数据拟合许多平行和垂直的线,那么我可以平均线之间的距离、角度等等。做这个的最好方式是什么?
更新: 我正在使用的数据大致如下所示:
将来它会更干净,但我只需要一些方法来插入和分析类似网格的模式。
我有许多点的集合,以统一的网格状方式排列。鉴于这些点,我如何检测该网格的属性,例如它的旋转、行间距等?如果有一些算法可以为这些数据拟合许多平行和垂直的线,那么我可以平均线之间的距离、角度等等。做这个的最好方式是什么?
更新: 我正在使用的数据大致如下所示:
将来它会更干净,但我只需要一些方法来插入和分析类似网格的模式。
如果将这些点放在一个网格上,那么 2 个点之间的平方距离为d² ×( m ² + n ²) 其中d是网格常数(假设它是一个在两个主要方向上具有相同常数的二维矩形网格), 和m , n是定义两点之间的(仿射)差异的整数(或者,更简单地说,沿着“x”和“y”轴的两点之间的网格间隔数)所以:
如果您只有网格的图像,您可以尝试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和文章末尾的教程链接)并分析其最大值。