2017-04-27 5 views
0

Ich versuche, ein Subsampling auf einer Liste von 8x8 2d Arrays zu tun. Genauer gesagt, von einem 8x8, möchte ich in ein 4x4 verwandeln, indem ich 2x2 Blöcke eins nach dem anderen nehme und den arithmetischen Mittelwert des 2x2 an der richtigen Stelle im 4x4 speichere. Nachdem ich dies getan habe, wäre die Ausgabe eine Liste von 4x4 2d Arrays. Die folgenden beiden Verfahren sind die Pflege dieser2d Array Subsampling - Java

public static long[][] subSample420(long[][] originalBlocks){ 
    long[][] downsampledBlocks = new long[4][4]; 
    long[] mediePixel = new long[16]; 
    int nr = 0; 
    for (int i = 0; i < 8; i += 2){ 
     for (int j = 0; j < 8; j += 2){ 
      mediePixel[nr] = Math.round((double)(originalBlocks[i][j] + originalBlocks[i][j+1] + originalBlocks[i+1][j] + originalBlocks[i+1][j+1])/4); 
      nr++; 
     } 
    } 
    nr = 0; 
    for (int i = 0; i < 4; i++){ 
     for (int j = 0; j < 4; j++){ 
      downsampledBlocks[i][j] = mediePixel[nr]; 
      nr++; 
     } 
    } 
    return downsampledBlocks; 
} 


public static List<long[][]> subSampleBlocks(List<long[][]> originalBlockList){ 
    List<long[][]> downsampledBlockList = new ArrayList<long[][]>(); 
    for (long[][] anOriginalBlockList : originalBlockList) { 
     downsampledBlockList.add(subSample420(anOriginalBlockList)); 
    } 
    return downsampledBlockList; 
} 

Jetzt, nachdem ich Subsampling fertig bin, habe ich die 4x4 2D-Arrays zurück zu ihrer ursprünglichen Größe, um die Größe, das heißt, die Liste der 4x4 2D-Arrays zurück in eine Transformation Liste von 8x8 2d Arrays, indem ein einzelner Wert aus dem 4x4 durch einen 2x2 Block mit dem gleichen Wert ersetzt wird. Die beiden Methoden, die dies tun, sind die folgenden:

public static long[][] resizeSubsampledBlocks(long[][] subBlocks){ 
    long[][] resizedBlocks = new long[8][8]; 
    int nr = 0; 
    long[] pixel = new long[16]; 
    for (int i = 0; i < 4; i++){ 
     for (int j = 0; j < 4; j++){ 
      pixel[nr] = subBlocks[i][j]; 
      nr++; 
     } 
    } 
    nr = 0; 
    for (int i = 0; i < 8; i += 2){ 
     for (int j = 0; j < 8; j += 2){ 
      resizedBlocks[i][j] = pixel[nr]; 
      resizedBlocks[i][j+1] = pixel[nr]; 
      resizedBlocks[i+1][j] = pixel[nr]; 
      resizedBlocks[i+1][j+1] = pixel[nr]; 
      nr++; 
     } 
    } 
    return resizedBlocks; 
} 


public static List<long[][]> reziseSubsampledBlockList(List<long[][]> subBlocks){ 
    List<long[][]> rezisedBlocks = new ArrayList<long[][]>(); 
    for (long[][] subBlock : subBlocks) { 
     rezisedBlocks.add(resizeSubsampledBlocks(subBlock)); 
    } 
    return rezisedBlocks; 
} 

Aber als ich versuchte, zu testen alle diese mit folgender Methode:

private static void testOrderSub(int nr){ 
    List<long[][]> testList = new ArrayList<long[][]>(); 
    for (int i = 0; i < nr; i++){ 
     long[][] matrix = { 
       {i,  i,  i+1, i+1, i+2, i+2, i+3, i+3}, 
       {i,  i,  i+1, i+1, i+2, i+2, i+3, i+3}, 
       {i+4, i+4, i+5, i+5, i+6, i+6, i+7, i+7}, 
       {i+4, i+4, i+5, i+5, i+6, i+6, i+7, i+7}, 
       {i+8, i+8, i+9, i+9, i+10, i+10, i+11, i+11}, 
       {i+8, i+8, i+9, i+9, i+10, i+10, i+11, i+11}, 
       {i+12, i+12, i+13, i+13, i+14, i+14, i+15, i+15}, 
       {i+12, i+12, i+13, i+13, i+14, i+14, i+15, i+15}}; 
     testList.add(matrix); 
    } 

    List<long[][]> subTest = FirstLevelEncoder.subSampleBlocks(testList); 
    List<long[][]> sizeTest = FirstLevelDecoder.reziseSubsampledBlockList(subTest); 
    for (int i = 0; i < nr; i++) { 
     if (!(Arrays.equals(testList.get(i), sizeTest.get(i)))){ 
      System.out.println("false"); 
     } 
    } 
} 

Die sizeTest.equals(testList) false zurück, auch wenn durch im Debugger suchen sie scheinen die gleichen Werte haben. Ich habe versucht, mit diesen Methoden ein Bild zu verarbeiten und die Ausgabe ist auch durcheinander. Mache ich etwas falsch? Warum sind die Listen nicht gleich?

+0

Weil, wie ich gesagt habe, ist es in dem Debugger in Ordnung aussieht, und ich kann nichts sehen. – Pred

+0

Verstanden: Wenn Sie list.equals (otherList) ... tun, das läuft auf array1.equals (array2) ... und das funktioniert nicht - da dies nicht einen elementweisen Vergleich macht. Sie müssen Arrays.equals() verwenden – GhostCat

+0

Sie haben Recht, ich änderte es in: 'für (int i = 0; i Pred

Antwort

1

Für ein Java-Array gleicht equals() wie array1 == array2. Es prüft, ob es sich um das gleiche Objekt handelt. Es prüft nicht, ob es den gleichen Inhalt hat.

Sie haben

Arrays.equals(array1, array2); 

Hier ist eine weitere Erklärung über Java-Arrays zu verwenden: equals vs Arrays.equals in Java

+0

Danke, ich habe es auch mal versucht, prüfe die editierte Testmethode im Original Post. Es sagt, dass die Arrays auch nicht gleich sind. Ich denke, ich mache etwas falsch in den Subsampling/Größenänderung Methoden, aber ich kann nicht sehen was. – Pred

+0

Danke nochmal, ich habe das Problem gefunden, es war woanders im Code. – Pred