【问题标题】:Detecting grid orientation and properties检测网格方向和属性
【发布时间】:2013-04-06 20:33:52
【问题描述】:

我有许多点的集合,这些点以统一的网格状方式排列。鉴于这些点,我如何检测该网格的属性,例如它的旋转、行间距等?如果有一些算法可以为这些数据拟合许多平行和垂直的线,那么我可以平均线之间的距离、角度等等。最好的方法是什么?

更新: 我正在使用的数据大致如下所示:

将来会更干净,但我只需要一些方法来插入和分析类似网格的模式。

【问题讨论】:

  • 网格是什么样的?如果它是矩形的,那么解决方案会更容易。
  • 确实是长方形的。我正在处理看起来像这样的数据www-personal.umich.edu/~schmatz/grid.jpg
  • 如果你真的可以对网格进行整形并保证它是一个矩形,那么左上角的点将是离原点最近的距离(假设是图像的左上角)。右下角是离原点最远的点。您可以在这两点之间形成一条线;离这条线最远的点将是网格中的左下角或右上角。通过这些点,您可以计算网格的旋转。你可以在这里看到我是如何在我的回答中使用它的:stackoverflow.com/questions/15604485/…
  • 只有图像吗?你有每个网格点的 (x,y) 坐标吗?

标签: matlab opencv computer-vision curve-fitting data-fitting


【解决方案1】:

如果将点放置在网格上,则2个点之间的平方距离是 D i>²×( m i>²+ n i>²其中 d i>是网格常数(假设它是主要方向上具有相同常数的2d矩形网格),并且 m i>, n i >是整数数字定义(或更简单,沿“X”和“Y”轴之间的两个点之间的网格间隔之间的(或更简单)之间的(或更简单)之间的差异)所以:

  • 计算一个点与所有其他点之间的平方距离;
  • 通过将它们划分为最小值,您将获得Rational Numbers,为您提供关于网格常数 D i>和相对“坐标” m i>的暗示,n.

【讨论】:

  • 谢谢!这应该是帮助。 span>
【解决方案2】:

如果您只有网格的图像,您可以尝试“图像处理工具箱”中的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和文章末尾的教程链接)并分析它的最大值。

【讨论】:

  • 谢谢!我会调查这个:)
【解决方案3】:

如果你有每个点的坐标,事情可能不会那么复杂。

在这些坐标上执行PCA 可能是个好主意。 第一个主成分是网格较长边的轴,第二个主成分是较短边的轴。

使用这些新轴,您可以沿主轴运行sweep-line algorithm,这将允许您为每个点分配一个行号。沿第二个轴再次扫描将允许您分配列号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2011-05-21
    • 2023-03-09
    相关资源
    最近更新 更多