1

过去,我在 SO 寻求帮助时取得了一些成功,并从你们那里获得了许多好的提示和技巧。我遇到了三个我非常想得到帮助的问题。首先,这是我用作输入的散点图的图片:

散点图

这是我用来生成该精确图的代码(减去手动箭头/线):

源代码

我想知道是否有人可以帮助我解决我遇到的三个问题:

  1. 鉴于上述几点,我如何以编程方式绘制我手动输入的那些线?我尝试了 LS 方法,它产生了 ok(ish) 的结果,我不确定得到“更紧”的直线。
  2. 我的数据中有时会出现异常值,它们与行/列方式中的其他数据不完全一致。有没有办法消除这些异常值(如情节 A 点所示)?
  3. 最后有没有办法计算每个“矩形”的“中心”,因为这些点没有按特定顺序排列?可以按特定顺序对这些点进行排序以提供帮助吗?还是有更聪明的方法?

感谢您花时间看我的问题。我真的希望有人能帮我解决这个问题——我一直在绞尽脑汁想弄清楚如何做这些事情,但我无法想出解决方案。

编辑:删除了指向我的 LS 方法的链接,因为它在水平方向上不正确。

4

1 回答 1

0

好的,所以我有一点休息时间来尝试在这里伸出援手。我想我至少可以让你开始以编程方式画线,并希望它能让你对解决这里的其他两个问题有所了解。

我几乎复制了你的代码并从那里开始。我在这里粘贴的是我在您声明 cx 和 cy 矩阵后添加/调整的内容。

现在来解释一下我的思维过程和逻辑。 Cy被设计为“压缩”矩阵,cxcy沿 Y 坐标值排序。 Cx是相同的,只是沿 X 坐标排序。我希望那里的逻辑等应该很简单。如果不是这样说,我会解释的!

现在diffYdiffX。我取了每个坐标的差值(Xs 和 Ys 分别),因为我们知道这里有一种模式会导致 XY 对形成网格状形状。我基本上依靠这样一个事实,即每行点(水平和垂直)的 Y(或 X)值存在相当大的差异。一旦我在相邻点之间有了这种差异,我就会寻找大于 2 的差异(这是在看到差异之后的事后)。-1 用于给我行的实际结束而不是下一行的开始,因为我们将从列表中的项目 (1,:) 开始(如果您查看行更有意义在代码中)。

(这当然是一个巨大的假设,并且对于这个特定的数据集来说是特定的。虽然它可能适用于大多数类似网格的形状,但必须进行测试。)

还有一个注释。我确实注意到,后来在我使用差异收集的要点列表中,我的思维过程开始崩溃。您可以继续按照我在代码中的模式绘制更多行,以了解我的意思。

至于你的另外两个问题。您可能会采用我在这里的想法并对其进行改进/扩展。我认为您应该能够通过简单地查看给定行 (idx[1] -> idx[2]) 中的所有点并确保它们符合这条线来捕捉异常值。本质上要求它们满足线方程的一般公式,您可以通过使用用于绘制线的点获得该公式。当然,您必须对此有一点容错能力。

然后对于矩形,您可以使用有序的点组来创建矩形,并可能利用该regionprops函数来计算由您可以收集的数据点指定的矩形的质心(2D 世界中的中心)。

祝你好运!

Cy = zeros(length(cy),2);
[Cy(:,2), IX] = sort(cy);
Cy(:,1) = cx(IX)';

diffY = [0; diff(Cy(:,2))]
idx = find(diffY>2)-1
Cy(idx,:) % Last mark in given row, appears to be slight issue further along.

Cx = zeros(length(cx),2);
[Cx(:,1), IX] = sort(cx);
Cx(:,2) = cy(IX)';

diffX = [0; diff(Cx(:,1))]
idx2 = find(diffX>2)-1
Cx(idx2,:) % Last mark in given row, appears to be slightly off later on. (top of grid though)



%%
figure('Position',[0,0,c,r]);
scatter(Cy(:,1),Cy(:,2),'.');
axis([0 c 0 r])
set(gca,'YDir','reverse')
% Horizontal lines
line([Cy(1,1) Cy(idx(1),1)], [Cy(1,2) Cy(idx(1),2)], 'Color', 'red', 'LineWidth', 2)
line([Cy(idx(1)+1,1) Cy(idx(2),1)], [Cy(idx(1)+1,2) Cy(idx(2),2)], 'Color', 'red', 'LineWidth', 2)
line([Cy(idx(2)+1,1) Cy(idx(3),1)], [Cy(idx(2)+1,2) Cy(idx(3),2)], 'Color', 'red', 'LineWidth', 2)

% Vertical lines
line([Cx(1,1) Cx(idx2(1),1)], [Cx(1,2) Cx(idx2(1),2)], 'Color', 'red', 'LineWidth', 2)
line([Cx(idx2(1)+1,1) Cx(idx2(2),1)], [Cx(idx2(1)+1,2) Cx(idx2(2),2)], 'Color', 'red', 'LineWidth', 2)
于 2012-08-03T14:46:07.370 回答