彩色轉灰度的優化計算

2021-05-24 10:18:47 字數 2318 閱讀 8660

一、基礎

對於彩色轉灰度,有乙個很著名的心理學公式:

gray = r*0.299 + g*0.587 + b*0.114

關於公式的**實現,可以參考benben的《如何將真彩色圖轉換為各種灰度圖

>>.

二、整數演算法

而實際應用時,希望避免低速的浮點運算,所以需要整數演算法。

注意到係數都是3位精度的沒有,我們可以將它們縮放1000倍來實現整數運算演算法:

gray = (r*299 + g*587 + b*114 + 500) / 1000

rgb一般是8位精度,現在縮放1000倍,所以上面的運算是32位整型的運算。注意後面那個

除法是整數除法,所以需要加上500來實現四捨五入。

就是由於該演算法需要32位運算,所以該公式的另乙個變種很流行:

gray = (r*30 + g*59 + b*11 + 50) / 100

但是,雖說上乙個公式是32位整數運算,但是根據80x86體系的整數乘除指令的特點,是

可以用16位整數乘除指令來運算的。而且現在32位早普及了(amd64都出來了),所以推薦使

用上乙個公式。

三、整數移位演算法

上面的整數演算法已經很快了,但是有一點仍制約速度,就是最後的那個除法。移位比除法

快多了,所以可以將係數縮放成 2的整數冪。

習慣上使用16位精度,2的16次冪是65536,所以這樣計算係數:

0.299 * 65536 = 19595.264 ≈ 19595

0.587 * 65536 + (0.264) = 38469.632 + 0.264 = 38469.896 ≈ 38469

0.114 * 65536 + (0.896) =  7471.104 + 0.896 = 7472

可能很多人看見了,我所使用的捨入方式不是四捨五入。四捨五入會有較大的誤差,應該

將以前的計算結果的誤差一起計算進去,捨入方式是去尾法:

寫成表示式是:

gray = (r*19595 + g*38469 + b*7472) >> 16

2至20位精度的係數:

gray = (r*1 + g*2 + b*1) >> 2

gray = (r*2 + g*5 + b*1) >> 3

gray = (r*4 + g*10 + b*2) >> 4

gray = (r*9 + g*19 + b*4) >> 5

gray = (r*19 + g*37 + b*8) >> 6

gray = (r*38 + g*75 + b*15) >> 7

gray = (r*76 + g*150 + b*30) >> 8

gray = (r*153 + g*300 + b*59) >> 9

gray = (r*306 + g*601 + b*117) >> 10

gray = (r*612 + g*1202 + b*234) >> 11

gray = (r*1224 + g*2405 + b*467) >> 12

gray = (r*2449 + g*4809 + b*934) >> 13

gray = (r*4898 + g*9618 + b*1868) >> 14

gray = (r*9797 + g*19235 + b*3736) >> 15

gray = (r*19595 + g*38469 + b*7472) >> 16

gray = (r*39190 + g*76939 + b*14943) >> 17

gray = (r*78381 + g*153878 + b*29885) >> 18

gray = (r*156762 + g*307757 + b*59769) >> 19

gray = (r*313524 + g*615514 + b*119538) >> 20

仔細觀察上面的**,這些精度實際上是一樣的:3與4、7與8、10與11、13與14、19與20

所以16位運算下最好的計算公式是使用7位精度,比先前那個係數縮放100倍的精度高,而

且速度快:

gray = (r*38 + g*75 + b*15) >> 7

其實最有意思的還是那個2位精度的,完全可以移位優化:

gray = (r + (word)g<<1 + b) >> 2

由於誤差很大,所以做影象處理絕不用該公式(最常用的是16位精度)。但對於遊戲程式設計

,場景經常變化,使用者一般不可能觀察到顏色的細微差別,所以最常用的是2位精度。

引自: http://www.cppblog.com/pengkuny/archive/2007/04/14/21877.aspx

彩色轉灰度

一 基礎 對於彩色轉灰度,有乙個很著名的心理學公式 gray r 0.299 g 0.587 b 0.114 二 整數演算法 而實際應用時,希望避免低速的浮點運算,所以需要整數演算法。注意到係數都是3位精度的沒有,我們可以將它們縮放1000倍來實現整數運算演算法 gray r 299 g 587 b...

彩色轉灰度演算法

彩色轉灰度演算法 上面的整數演算法已經很快了,但是有一點仍制約速度,就是最後的那個除法。移位比除法快多了,所以可以將係數縮放成 2的整數冪。一 基礎 對於彩色轉灰度,有乙個很著名的心理學公式 gray r 0.299 g 0.587 b 0.114 二 整數演算法 而實際應用時,希望避免低速的浮點運...

bmp彩色轉灰度

一 基礎 對於彩色轉灰度,有乙個很著名的心理學公式 gray r 0.299 g 0.587 b 0.114 二 整數演算法 而實際應用時,希望避免低速的浮點運算,所以需要整數演算法。注意到係數都是3位精度的沒有,我們可以將它們縮放1000倍來實現整數運算演算法 gray r 299 g 587 b...