2013-07-23 29 views
0

我想根據以下參數合併兩個B & W圖像。合併2個圖像使用2D陣列作爲像素

新創建的數組使用兩個圖像的寬度和高度中最大的一個作爲它自己的。數組中特定點處的int包含表示灰度數量的數字。新的二維數組將根據以下條件合併兩幅圖像。

  • 如果在兩個數組中都存在位置,則results數組中的值是數組a和b中值的平均值。
  • 如果只存在於陣列中的位置,結果陣列中的值是在陣列的
  • 的值,如果只存在於數組b的位置,結果陣列中的值是在數組值b
  • 如果位置不在數組中,則在結果數組中的該位置分配值127。

這是我的代碼。由於某種原因,它不會運行,因爲它返回arrayIndexOutOfBounds: 167。如果有人能查看它,我會很感激。

public static int[][] merge(int[][] a, int[][] b) 
{ 
    int biggerx = 0; 
    int biggery = 0; 
    if (a[0].length > b[0].length) { 
     biggery = a[0].length; 
    } 
    else { 
     biggery = b[0].length; 
    } 
    if (a.length > b.length) { 
     biggerx = a.length; 
    } 
    else { 
     biggerx = b.length; 
    } 
    int[][] merged = new int[biggerx][biggery]; 
    for (int x = 0; x < merged.length; x++) { 
     for (int y = 0; y < merged[x].length; y++) { 
      if (x <= a.length && y <= a[x].length && x > b.length && y > b[x].length) { 
       merged[x][y] = a[x][y]; 
      } 
      else if (x <= b.length && y <= b[x].length && x > a.length && y > a[x].length) { 
       merged[x][y] = b[x][y]; 
      } 
      else if (x <= b.length && y <= b[x].length && x <= a.length && y <= a[x].length) { 
       merged[x][y] = ((a[x][y] + b[x][y]) /2); 
      } 
      else { 
       merged[x][y] = 127; 
      } 
     } 
    } 
    return merged; 
} 
+0

爲了更好地幫助越早,張貼[SSCCE(http://sscce.org/)。 –

回答

0
else if (x <= b.length && y <= b[x].length && x <= a.length && y <= a[x].length) { 
    merged[x][y] = ((a[x][y] + b[x][y]) /2); // <= problematic line 
} 
在這一行

你試圖達成一個點,它是出A的約束。在我的例子中,我將a設爲(10, 10),b設爲(5, 20)。它在x = 0, y = 10時墜毀。現在,你可以看到a[0][10]超出了界限。

這是我審判的代碼,它的輸出:

else if (x <= b.length && y <= b[x].length && x <= a.length && y <= a[x].length) { 
    System.out.println("x = " + x + " y = " + y); 
    System.out.println("merged.length = " + merged.length); 
    System.out.println("merged[0].length = " + merged[0].length); 
    System.out.println("a.length = " + a.length); 
    System.out.println("a[0].length = " + a[0].length); 
    System.out.println("b.length = " + b.length); 
    System.out.println("b[0].length = " + b[0].length); 
    System.out.println(); 
    System.out.println(); 
    merged[x][y] = ((a[x][y] + b[x][y]) /2); 
} 

輸出:

x = 0 y = 10 

merged.length = 10 

merged[0].length = 20 

a.length = 10 

a[0].length = 10 

b.length = 5 

b[0].length = 20 

編輯:我建議只注意到解決方案並不適用於你。

EDIT2:需要x <= a.lengthy <= a[x].length樣的語句來變成x < a.lengthy < a[x].lengthx <= a.length - 1y <= a[x].length - 1

+0

仍然返回出界,這是修改後的代碼。 – Skarl

+0

if(x <= a.length-1 && y <= a [x] .length-1 && x> b.length && y> b [x] .length){ merged [x] [y] = a [X] [Y]; (x <= b.length-1 && y <= b [x] .length-1 && x> a.length && y> a [x] .length){ merged [x] [y ] = b [x] [y]; (x <= b.length-1 && y <= b [x] .length-1 && x <= a.length-1 && y <= a [x] .length-1){ } 合併[x] [y] =((a [x] [y] + b [x] [y])/ 2); } else { merged [x] [y] = 127; } – Skarl

+0

然後,您需要重新審視if語句,因爲它們允許a和b的界限值超出範圍。 –