Arrays 2D para una matriz en laboratorio C

Esta es una generalización de la pregunta anterior para matrices 2D. En compresión de video, esto se conoce como estimación de movimiento. El video se divide en cuadros, cada cuadro se divide en bloques (por ejemplo, el cuadro podría ser 1000 x 1000 y el bloque es 10 x 10). Eso significa que cada cuadro es de 10.000 bloques. Si sé que el bloque número x en el fotogtwig actual se trasladó a la ubicación y en el siguiente fotogtwig, en lugar de enviar el bloque 10 x 10, enviaré “movido a Y”, que es mucho menos datos que todo el bloque. El punto es calcular Y (o YX para ser exactos).

Considere la imagen de arriba que muestra un cuadro M x N y dos subbloques, un subbloque con su esquina superior izquierda en (i1, j1) y el segundo en (i2, j2). El segundo bloque es una traducción del primer bloque por i2-i1 en la dirección i, y j2-j2 en la dirección j. La diferencia entre estos bloques es (hay muchas formas de calcular esto, usaremos la más fácil, que es la sum de los errores absolutos).

k−1 k−1 Δ=∑∑∣ x[i+i1][ j+ j1]−x[i+i2][ j+ j2] ∣. i=0 j=0 

Ahora, ¿cómo funciona eso?

Comenzando con el primer bloque (i1, j1) Busque el bloque con la distancia mínima moviendo este bloque en la dirección vertical y horizontal. Primero, movemos el bloque en la dirección i de i1 − δ a i1 + δ y en la dirección j de j1 − δ a j1 + δ, donde δ varía de 1 → z. Si z es 3, entonces consideramos -3, -2, -1, 1,2,3 para ambas direcciones vertical y horizontal para un total de 36 bloques diferentes. Calculamos la diferencia entre el bloque original y estos 36 bloques y elegimos el que tiene la distancia mínima.

En esta práctica de laboratorio, se le proporciona el tamaño de marco (M, N), el tamaño de bloque (k), la posición de bloque (i1, j1) y la distancia máxima para la búsqueda (z). Calcule el bloque con la diferencia mínima con la distancia especificada.

Fichero de entrada

 MN k z i1 j1 matrix size M-by-N row by row 

Salida

 i2-i1 j2-j1 difference. 

Ejemplo

 8 8 3 2 2 1 1 2 3 4 5 6 7 8 9 10 11 12 3 4 5 6 7 8 ... (64 elements) 

Aquí está mi código actual

 #include  Int difference(int b[][], int M, int N) { int temp = 0, i; j; for(i =0;i<N;i++) { for(j=0;j<M;j++){ temp += ((b[i + i1][j+j1]) - (b[i + i2][j+j2])); // square it???? } } return temp; } int main() { int M, int N, int k, int z, int i1, int j1, b // initialize ints int b[N][M]; // universe double array int jj, ii; // for incrementing int i2,j2; int value = INT_MAX; // max value possible int saveRotation; // direction int saveEnd; // lowest scanf("%d", &M); // store M length scanf("%d", &N); // store N length scanf("%d", &k); // store k block size scanf("%d", &z); // store max search movement scanf("%d", &i); // store i location (y) scanf("%d", &j); // store j location (x) for(ii=0; ii < N; ii++) { for(jj=0; jj < M; jj++) { // putting double array values into defined array length scanf("%d, &a[ii][jj]) // storing } } int c1[k-1][k-1], c2[k-1][k-1]; // size of 2 sub arrays c1[0][0] = a[i][j]; // setting block to chosen start 0 value for(ii=1; ii < k+1; ii++){ for(jj=1; jj < k+1; jj++) { // creating the first sub double array c1[ii][jj] = a[i][j]; } } for(ii=0; ii < N; ii++) { // first loop for(jj=0; jj difference(b[][], M, N)) { value = difference(a[][], M, N); save_rotation = ii * jj; // potential lowest difference ??? } // NEED TO USE THE Z VALUE FOR POSSIBLE SHIFTS THAT RESULT IN LOWEST DIFFERENCE } } int saveI, saveJ; saveI = i2 - i1; saveJ = j2 - j1; printf("Output"); printf("%d \n",saveI + saveJ); printf("%d \n",save_rotation); return 0; }