2011-04-14 41 views
3

鑑於一個int從DataBuffer中,其具有包裝在其與掩模ARGB數據計算Java中兩個ARGB整數之間差異的最快方法?

A = 0xFF000000 R =爲0xFF0000 G =爲0xFF00 B = 0xFF的

我做以下但不知道是否Java中沒有更快的方法?

 DataBuffer db1 = img1.getData().getDataBuffer(); 
     DataBuffer db2 = img2.getData().getDataBuffer(); 

     int x, y; 
     int totalDiff = 0; 
     for (int i = 0; i < WIDTH * HEIGHT; ++i) { 
      x = db1.getElem(i); 
      y = db2.getElem(i); 

      totalDiff += Math.abs((x & 0xFF) - (y & 0xFF)) 
         + Math.abs(((x & 0xFF00) >> 8) - ((y & 0xFF00) >> 8)) 
         + Math.abs(((x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16)); 
     } 
+1

應該是什麼0xFF000000'和'0x00FF0000'的'的差異。 – 2011-04-14 10:26:37

+0

沒有區別,上面的代碼忽略A,從x和y中提取單獨的R,G和B分量並獲取差異,然後添加差異的絕對值。因此x的是0xFF010101和y是0xFF020202則差值將是3 – Johnny 2011-04-14 10:32:25

+0

而0xFF010104和0xFF020202之間的差異將是0?只是檢查這是否是故意的。 – 2011-04-14 10:35:43

回答

3

如果你真的需要加快你可能要檢查的DataBuffer類型和具體類型,這樣你的來電保存到getElem(i)提供優化的代碼。這會加快你的代碼的速度。

事情是這樣的:

DataBuffer db1 = img1.getData().getDataBuffer(); 
    DataBuffer db2 = img2.getData().getDataBuffer(); 

    int totalDiff = 0; 
    int x, y; 
    if (db1 instanceof DataBufferInt && db2 instanceof DataBufferInt) { 
     int[] data1 = ((DataBufferInt) db1).getData(); 
     int[] data2 = ((DataBufferInt) db2).getData(); 
     for (int i = 0; i < WIDTH * HEIGHT; ++i) { 
      x = data1[i]; 
      y = data2[i]; 

      totalDiff += Math.abs((x & 0xFF) - (y & 0xFF)) 
       + Math.abs(((x & 0xFF00) >> 8) - ((y & 0xFF00) >> 8)) 
       + Math.abs(((x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16)); 
     } 
    } else { 
     for (int i = 0; i < WIDTH * HEIGHT; ++i) { 
      x = db1.getElem(i); 
      y = db2.getElem(i); 

      totalDiff += Math.abs((x & 0xFF) - (y & 0xFF)) 
        + Math.abs(((x & 0xFF00) >> 8) - ((y & 0xFF00) >> 8)) 
        + Math.abs(((x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16)); 
     } 
    } 

編輯: 另一個想法會帶給你更高的加速。如果這只是一種啓發式算法,那麼計算一下圖像的某種「下采樣」版本的差異就足夠了。通過i+=10更換++i和10倍。當然獲得加速,如果這是有道理的依賴於類型的圖像。

編輯: 在你提到一個評論它是一個GA健身功能......在這種情況下,它可能足以抓住從您的圖片100(或僅10?)隨機位置,並在像素比較那個地點。獲得的加速將最有可能勝過準確度的損失。

+0

這並沒有給出相同的結果:r,g,b分量沒有單獨進行比較 – 2011-04-14 11:27:11

+0

Ups;)。對...所以我們只能使用這種方法僅保存對「getElem(i)」的調用......這隻會使速度提高10%......比沒有更好。 – Arne 2011-04-14 11:32:03

+0

調整了代碼。 – Arne 2011-04-14 11:40:06

0

如果計算平方和是否可接受,它是更快:

for (int i = 0; i < WIDTH * HEIGHT; ++i) { 
     x = db1.getElem(i); 
     y = db2.getElem(i); 
     int dr = ((x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16); 
     int dg = ((x & 0xFF00) >> 8) - ((y & 0xFF00) >> 8); 
     int db = (x & 0xFF) - (y & 0xFF); 
     totalDiff += dr*dr + dg*dg + db*db; 
    } 
1

與@Arne同意。

您也可以刪除移權利

(x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16). 

你知道abs(XX0000 - YY0000)只會在0-255的範圍內。

這將有助於如果你能提出什麼是你正在試圖確定?

也就是說,可以在像素信息可以儲存更多conducively你試圖acheive,例如色度(YUV,YCrCb的)什麼?

+1

'abs(XX0000 - YY0000)'在'[-FF0000,FF0000]'範圍內。你仍然需要向右移動,但是你可以在'abs'操作後完成:'abs((x&0xFF0000) - (y&0xFF0000))>> 16'。 – Jordi 2011-04-14 12:04:46

+0

斑點。這只是GA的一種啓發式算法,用於計算兩個圖像之間的差異作爲單個數字。 0 ==沒有區別。 – Johnny 2011-04-14 12:08:43

+0

在這種情況下,如果totalDiff> 0 – 2011-04-14 13:08:08

相關問題