Следующая функция вычисляет взвешенный центр данного изображения.
Изображение представлено в виде массива логических. Черный представлен как «истина», а белый - как «ложь».
double[] weightedCenter(boolean[][] img){
int W = img.length;
int H = img[0].length;
double centerX = 0;
double centerY = 0;
for(int i=0;i<W;i++){
for(int j=0;j<H;j++){
if(!img[i][j])
continue;
centerX += nbs(img, i, j) * i;
centerY += nbs(img, i, j) * j;
}
}
centerX /= (W * H);
centerY /= (W * H);
return new double[]{centerX, centerY};
}
Вес для каждого черного пикселя рассчитывается (согласно запросу) на основе количества ближайших черных соседей.
double nbs(boolean[][] img, int x, int y){
int W = img.length;
int H = img[0].length;
int[] offset = {-1, 0, 1};
double nb0 = 0;
double nb1 = 0;
for(int xOff : offset){
for(int yOff : offset){
int x2 = x + xOff;
int y2 = y + yOff;
if(x2 < 0 || x2 >= W || y2 < 0 || y2 >= H)
continue;
nb0++;
if(img[x2][y2])
nb1++;
}
}
return nb1 / nb0;
}