В принципе цикл через каждый пиксель в вашем найденном объекте и бункере его в сетку с помощью модуля вашего шага сетки , Вероятно, есть более быстрые/более эффективные способы сделать то, что вам нужно, но это выполнит эту работу.
int[][] grid
int gridSpacing
int[][] objectPix
for(objectPix[][] "x")
for(objectPix[] "y")
gridSpacing[Math.Floor(x/gridSpacing)][Math.Floor(y/gridSpacing)]++
Затем на конечной стадии (если вы хотите процент) пройти через сетку и разделить его значение на общее количество пикселей оп в объекте.
С более подробной информацией/усилием вы могли бы, вероятно, сделать умное рекурсивное решение, которое разделило бы прямоугольник до тех пор, пока оно не будет находиться только в одной сетке (и отслеживаемой области на каждом сплите). Но я оставлю это решение вам, если вам нужна эффективность.
Рекурсивный метод только с использованием вершин (в 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;
}
}
Я написал это быстро и не проверял, но он передает метод, который я думаю, что позволит вам делать то, что вы хотите. Опять же, последний шаг будет проходить через сетку и делить все ячейки по исходной области прямоугольника, чтобы превратить их в проценты ...
Что случилось с вычислением процента ячейки, просто подсчитав количество пикселов blob, лежащих в нем, и разделив их на общее количество пикселов blob? EDIT: теперь я вижу, что ваши «капли» заданы как прямоугольники, но если вы получите их как (x, y, w, h), то они должны быть выровнены по оси прямоугольников, что красная капля на вашей фотографии отсутствует. Что он? –
Конечно, сетка и blob выравниваются по всей оси. Как бы вы подсчитали пиксели blob, которые лежат в ячейке? Я не уверен, в каком языке программирования я могу развернуть, но я читал, что C++, например, имеет такие функции, как intersection() и union() для прямоугольников? – alberto2000
Если сетка и blob выравниваются по оси, пожалуйста, поверните фотографию, чтобы показать это, в противном случае это вводит в заблуждение. –