好的,所以我有一点休息时间来尝试在这里伸出援手。我想我至少可以让你开始以编程方式画线,并希望它能让你对解决这里的其他两个问题有所了解。
我几乎复制了你的代码并从那里开始。我在这里粘贴的是我在您声明 cx 和 cy 矩阵后添加/调整的内容。
现在来解释一下我的思维过程和逻辑。 Cy
被设计为“压缩”矩阵,cx
但cy
沿 Y 坐标值排序。 Cx
是相同的,只是沿 X 坐标排序。我希望那里的逻辑等应该很简单。如果不是这样说,我会解释的!
现在diffY
和diffX
。我取了每个坐标的差值(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)