假设我正在提供包含黑白像素的2D数组。我想找到基于相邻像素的“中心”或数据点。这意味着最密集的部件具有最高的冲击力,而小的松散/散射/薄的部件仅具有小的冲击力。
这是我的用例的示例图像:
在此场景中找到中心的最佳算法是什么?
以下函数计算给定图像的加权中心。图像表示为布尔数组。黑色表示为“真实”,白色表示为“假”。
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;
}