よし、ここで手を貸すために少しダウンタイムがあった。少なくとも、プログラムで線を引くことから始めることができると思います。うまくいけば、ここにある他の 2 つの質問に取り組むための洞察が得られることを願っています。
私はあなたが持っていたコードをほとんどコピーして、そこから始めました。ここに貼り付けたのは、cx と cy マトリックスを宣言した後に追加/調整したものです。
ここで、私の思考プロセスと論理を説明します。 Cy
の「圧縮された」行列になるように設計されていますがcx
、cy
Y 座標値に沿って並べ替えられています。 Cx
代わりに X 座標に沿ってソートされることを除いて同じです。ロジックなどはかなり単純明快なはずです。そう言うだけでなく、説明します!
diffY
とdiffX
. _ XY ペアが格子状の形状を形成するパターンがここにあることがわかっているので、各座標 (X と Y を別々に) の差を取りました。私は基本的に、ポイントの各行(水平および垂直)のY(またはX)値にかなりの違いがあるという事実に頼っています。隣接点間にこの差があると、2 より大きい差を探します (これは、差が何であったかを確認した後の事後的なものです)。-1 は、次の行の開始ではなく、行の実際の終了を示すために使用されます。これは、リスト内の項目 (1,:) から開始するためです (行を見ればより意味があります)。コードで)。
(もちろん、これは非常に大きな仮定であり、この特定のデータ セットに固有のものです。ただし、ほとんどのグリッドのような形状で一般化できる可能性がありますが、テストする必要があります。)
また、メモ。違いを使って集めたポイントのリストの後半で、私の思考プロセスが崩壊し始めたことに気付きました。コードにあるパターンに従って、さらに多くの行をプロットし続けて、私が何を意味するかを確認できます。
他の2つの質問まで。あなたはおそらく私がここで持っているアイデアを取り入れて、それを改善/拡張することができます. 特定の行 (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)