float[][] tp = new float[100][N * N];
for (int i = 0; i < 10; i++) {
int x = (value.getWidth() - N) * i / 10;
for (int j = 0; j < 10; j++) {
int y = (value.getHeight() - N) * j / 10;
FloatImage patch = value.crop(x, y, N, N).convert(FloatImage.RGB2GRAY);
float[] pels = patch.getData();
for (int k = 0; k < N * N; k++)
tp[i * 10 + j][k] = (pels[k] - mean[k]) * g[k];
}
}
float[] cov = new float[N * N * N * N];
for (int i = 0; i < N * N; i++)
for (int j = 0; j < N * N; j++) {
cov[i * N * N + j] = 0;
for (int k = 0; k < 100; k++)
cov[i * N * N + j] += tp[k][i] * tp[k][j];
}
context.write(new IntWritable(0), new FloatImage(N * N, N * N, 1, cov));
}
}