に重なる基本的にループ。おそらくより速く、より効率的な方法で必要なことをすることができますが、これで作業が完了します。
int[][] grid
int gridSpacing
int[][] objectPix
for(objectPix[][] "x")
for(objectPix[] "y")
gridSpacing[Math.Floor(x/gridSpacing)][Math.Floor(y/gridSpacing)]++
は、次に最後のステップ(あなたがパーセンテージをしたい場合)には、グリッドを通過し、オブジェクト内の総数のOPピクセルによって、その値を割ます。
詳細/努力をすれば、矩形が1つのグリッド(および各分割のトラック領域)にのみ存在するまで、矩形を分割する賢明な再帰的な解決策を作成できます。しかし、効率が必要な場合は、その解決策を残しておきます。
のみ(C#の場合)の頂点を使用して再帰的な方法:
public void splitRectangle(ref int[][] grid, int gridSpacing, rect curRect)
{
//if rectangle has verticies in different grid zones, split it
if(Math.Floor(curRect.pt.x/gridSpacing) != Math.Floor((curRect.pt.x + curRect.width)/gridSpacing))
{
int xDiv = gridSpacing*(Math.Floor(curRect.pt.x/gridSpacing) + 1) - curRect.pt.x;
rect split1 = new rect(curRect.pt, xDiv, curRect.height);
rect split2 = new rect(new point(curRect.pt.x + xDiv, curRect.pt.y), curRect.width - xDiv, curRect.height);
splitRectangle(grid, gridSpacing, split1);
splitRectangle(grid, gridSpacing, split2);
}
else if (Math.Floor(curRect.pt.y/gridSpacing) != Math.Floor((curRect.pt.y + curRect.height)/gridSpacing))
{
int yDiv = gridSpacing*(Math.Floor(curRect.pt.y/gridSpacing) + 1) - curRect.pt.y;
rect split1 = new rect(curRect.pt, curRect.width, yDiv);
rect split2 = new rect(new point(curRect.pt.x, curRect.pt.y+yDiv), curRect.width, curRect.height-yDiv);
splitRectangle(grid, gridSpacing, split1);
splitRectangle(grid, gridSpacing, split2);
}
//if rectangle is fully contained within 1 grid zone, then add its area to that gridZone
else
{
grid[Math.Floor(curRect.pt.x/gridSpacing)][Math.Floor(curRect.pt.y/gridSpacing)] += curRect.width * curRect.height;
}
}
私はすぐにこれを書いて、それをテストしていないが、それは、私はあなたがやりたいことができますだと思う方法を伝えます。再び、最後のステップはグリッドを通過し、元の矩形領域で分割して元の矩形領域に分割します。
セルのパーセンテージを計算するのは、その中にあるブロブピクセルの数を数え、ブロブピクセルの総数で割るだけです。編集:私は今あなたの "ブロブ"は長方形として与えられているが、(x、y、w、h)としてそれらを取得する場合は、軸の整列した矩形である必要があります。どちらですか? –
もちろん、グリッドとブロブはすべて軸合わせされています。どのようにセル内にあるBLOBピクセルを数えますか?どのプログラミング言語でデベロップメントができるのか分かりませんが、C++には、矩形の場合はintersection()やunion()などの関数があります。 – alberto2000
グリッドとブロブが軸合わせされている場合は、写真を回転して表示してください。そうでない場合は誤解を招く恐れがあります。 –