2017-04-27 77 views
0

我想在8x8二维数组列表上进行子采样。更确切地说,从8x8开始,我想通过逐个2x2块变换为4x4,并将2x2的算术平均值保存在4x4的正确位置。我这样做后,输出将是一个4x4二维数组列表。以下两种方法都利用这个二维数组子采样 - 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; 
} 

护理现在,我做了二次取样后,我不得不调整4×4二维数组回其初始大小,这意味着改造4×4二维数组的列表返回到8x8 2d阵列的列表,用4x4中的单个值替换为相同值的2x2块。这两种方法是这样做有以下几种:

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

但是,当我试图测试所有这些与下面的方法:

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"); 
     } 
    } 
} 

sizeTest.equals(testList)返回false,即使看在调试器,他们似乎具有相同的值。我试图使用这些方法来处理图像,输出也被搞乱了。难道我做错了什么?为什么列表不相同?

+0

因为正如我已经说过,它看起来在调试器好吗,我看不出什么毛病。 – Pred

+0

明白了:当你做list.equals(otherList)...归结为array1.equals(array2)...并且不起作用 - 因为这不会执行逐个元素的比较。你需要使用Arrays.equals() – GhostCat

+0

你是对的,我改变它:'for(int i = 0; i Pred

回答

1

对于Java-Array equals()正在测试像array1 == array2。它检查它是否是同一个对象。它不检查它是否具有相同的内容。

你必须使用

Arrays.equals(array1, array2); 

这里是关于Java的数组另一种解释:equals vs Arrays.equals in Java

+0

谢谢,我也试过你的方法,在原帖中查看编辑过的测试方法。它说阵列不相同。我认为我在二次采样/调整大小的方法中做了错误的事情,但我看不出什么。 – Pred

+0

再次感谢,我发现问题,它在代码中的其他地方。 – Pred