2014-02-28 49 views
0

我正在實現一個圖像處理任務,在該任務中,我比較了像素的顏色a 巨大的次數,並且我需要比較代碼儘可能快地執行。目前該圖像採用ARGB_8888格式:我忽略了透明度。所以我使用紅色,綠色和藍色的絕對差異總和作爲我對顏色差異的度量,儘管這種差異度量的選擇並不是石頭設定的(例如,也許差異的平方和可能更好有些意義)。估計顏色差異的快速方法

int coldif(int c1,int c2) 
{ 
    return (Math.abs((c1&0xff)   -(c2&0xff)))    + 
      (Math.abs(((c1&0xff00)>> 8) -((c2&0xff00)>> 8)))  + 
      (Math.abs(((c1&0xff0000)>> 16)-((c2&0xff0000)>> 16))); 
} 

所以我很感興趣的是我現有的算法快,或者使用色差的不同措施,甚至整個圖像轉換成不同的顏色表示作爲前處理,然後將允許的方式將使用不同的色差算法。

+0

什麼樣的你需要「差異」嗎?例如,「return c1 == c2」的明顯解決方案僅提供相同/不相同的差異。你需要知道「多少不同」的顏色,或者比較(c1,c2)和(c1,c3)之間的差異嗎? –

+0

@ Oleg Estekhin:我需要某種程度的差異度量。所以只使用==或!=不夠好。 – Mick

回答

1

這真的是一個瓶頸嗎?我能想到的是減少移位操作的量是這樣的:

int coldif(int c1,int c2) 
{ 
    return (Math.abs((c1&0x0000ff) - (c2&0x0000ff))  ) + 
      (Math.abs((c1&0x00ff00) - (c2&0x00ff00)) >> 8) + 
      (Math.abs((c1&0xff0000) - (c2&0xff0000)) >> 16); 
} 
0

另一個變體是有點快,但還是可以比較多個顏色對之間的差異有用:

int coldif(int c1, int c2) { 
    int d = c1^c2; 
    return (d & 0xff) + ((d >>> 8) & 0xff) + ((d >>> 16) & 0xff); 
} 
+0

它似乎沒有產生與OP相同的值(只是在我的程序中試過)......是一個錯誤,還是你說這只是一種不同類型的度量。 – Mick

+0

這是不同類型的措施。 –