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?
Weil, wie ich gesagt habe, ist es in dem Debugger in Ordnung aussieht, und ich kann nichts sehen. – Pred
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
Sie haben Recht, ich änderte es in: 'für (int i = 0; i
Pred