Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 检测网格方向和属性_Matlab_Opencv_Computer Vision_Curve Fitting_Data Fitting - Fatal编程技术网

Matlab 检测网格方向和属性

Matlab 检测网格方向和属性,matlab,opencv,computer-vision,curve-fitting,data-fitting,Matlab,Opencv,Computer Vision,Curve Fitting,Data Fitting,我收集了许多点,这些点以统一的网格形式排列。给定这些点,我如何检测该栅格的属性,例如它的旋转、线间距等?如果有某种算法可以将许多平行线和垂直线拟合到这些数据中,那么我可以平均线之间的距离、角度等等。最好的方法是什么 更新: 我正在处理的数据大致如下所示: 将来会更干净,但我只需要一些方法来插值和分析网格状图案。如果将点放置在网格上,则两点之间的平方距离为d²×m²+n²,其中d是网格常数(假设它是一个在两个主方向上具有相同常数的二维矩形网格),m,n是定义两点之间(仿射)差的整数(或者更简单地

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

更新: 我正在处理的数据大致如下所示:


将来会更干净,但我只需要一些方法来插值和分析网格状图案。

如果将点放置在网格上,则两点之间的平方距离为d²×m²+n²,其中d是网格常数(假设它是一个在两个主方向上具有相同常数的二维矩形网格),m,n是定义两点之间(仿射)差的整数(或者更简单地说,是沿“x”和“y”轴的两点之间的网格间隔数),因此:

  • 计算一个点和所有其他点之间的平方距离
  • 通过将它们除以最小值,您将得到有理数,这些有理数给出关于网格常数d和相对“坐标”m,n的提示

如果将点放置在网格上,则两个点之间的平方距离为d²×m²+n²,其中d是网格常数(假设它是在两个主方向上具有相同常数的二维矩形网格),m,n是定义两个点之间(仿射)差的整数(或者,更简单地说,沿“x”和“y”轴的两点之间的栅格间隔数)因此:

  • 计算一个点和所有其他点之间的平方距离
  • 通过将它们除以最小值,您将得到有理数,这些有理数给出关于网格常数d和相对“坐标”m,n的提示

如果您只有网格的图像,您可以尝试“图像处理工具箱”中的
radon
功能。该功能将为您提供角度,并且通过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提出的方法有点“过于暴力”。我宁愿计算你的点的“结构因子”(参见本文末尾的教程链接)并分析其最大值。

如果你只有网格的图像,你可以尝试使用“图像处理工具箱”中的
radon
函数。它将为您提供角度,通过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提出的方法有点“过于暴力”。我宁愿计算你的点的“结构因子”(参见本文末尾的教程链接)并分析其最大值。

网格是什么样子的?如果它是长方形的,那么解就更容易了。它确实是长方形的。我处理的数据看起来是这样的,如果你能实际塑造网格并保证它是矩形,那么左上角的点就是离原点最近的距离(假设是图像的左上角)。右下角点将是距离原点最远的距离。你可以在这两点之间画一条线;距此线最远的点将是栅格中的左下角点或右上角点。使用这些点可以计算栅格的旋转。你可以看到我在这里的回答中是如何使用这一点的:图像是你唯一拥有的东西吗?你有每个网格点的(x,y)坐标吗?网格看起来像什么?如果它是长方形的,那么解就更容易了。它确实是长方形的。我处理的数据看起来是这样的,如果你能实际塑造网格并保证它是矩形,那么左上角的点就是离原点最近的距离(假设是图像的左上角)。右下角点将是距离原点最远的距离。你可以在这两点之间画一条线;距此线最远的点将是栅格中的左下角点或右上角点。使用这些点可以计算栅格的旋转。你可以看到我在这里的回答中是如何使用这一点的:图像是你唯一拥有的东西吗?你有每个网格点的(x,y)坐标吗?谢谢!这真的应该有帮助。谢谢!这真的应该有帮助。谢谢!我会调查的:)谢谢!我将对此进行调查:)