Нахождение центра в случайных данных на основе соседних точек - PullRequest
0 голосов
/ 11 сентября 2018

Скажем, я даю 2D-массив, который содержит черные и белые пиксели.Я хочу найти «центр» или точки данных на основе соседних пикселей.Это означает, что самые плотные детали имеют наибольшее влияние, а небольшие рыхлые / рассеянные / тонкие имеют только небольшое влияние.

Вот примерные изображения для моего варианта использования:

Sample1

Каков наилучший алгоритм в этом сценарии для поиска центра?

1 Ответ

0 голосов
/ 11 сентября 2018

Следующая функция вычисляет взвешенный центр данного изображения. Изображение представлено в виде массива логических. Черный представлен как «истина», а белый - как «ложь».

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;
}
...