天天看點

OpenCV, color reduction method

OpenCV, colorreduction method

目标:

         這次學習的目标是回答以下的幾個問題:

                  1 圖檔像素是怎樣被掃描的?

                   2OpenCV 矩陣值怎樣被存儲?

                   3怎樣衡量算法的性能?

                   4什麼是查找表和為什麼要用他們?

         看完這篇,希望可以解決上面的這些問題。

正文:

         首先我們考慮一下簡單的色彩減少方法(color reduction method,翻譯的不好請指正),假設使用的是c或c++無符号的char(八位元組大小的空間),一個信道(channel)有256個不同的值(2^8=256),可是假設使用的是GRB方案,三個channel的話,顔色的數量就會變為256*256*256,大概是16個million這麼多,這麼多的顔色數量,對于計算機來說仍然是一個負擔,是以能夠想一些方法來減少這些色彩數量。

         能夠使用簡單的方法來減少圖像色彩空間,比方,将0-9的數字都統一用0來取代,10-19的數字都統一用10取代。這樣的轉換方案能夠用以下的公式表示

OpenCV, color reduction method

         通過上面的公式,把全部像素點的值更新一下。可是,上面的公式中有除法,這裡要表達一個是,計算量比較多的情況下,不用乘除,就不要用,最好把他們轉換為加減。我們知道,在轉換前像素點的值僅僅有256個,是以我們能夠用查找表的方式,我們事先把全部的計算結果都儲存在一個數組裡,每次要運作上面的公式計算的時候,結果直接從數組裡取出來就ok了。比方32相應30,表table[32]=30是早計算出來的,直接訪問table[32]就OK了。

圖檔矩陣怎樣在記憶體中存儲的:

灰階圖檔的矩陣存儲方式:

         灰階圖檔的每個像素點,僅僅由一個值來表示,是以,就是一個普通的二維矩陣。

OpenCV, color reduction method

彩色圖檔的矩陣存儲方式:

OpenCV, color reduction method

         彩色圖檔的存儲方式和灰階圖檔不一樣,這裡展示的是RGB格式的,能夠看到,每個像素,由三個值,代表藍色,綠色,紅色的三個數值表示,存儲方式不是三維的,而是二維,隻是列向量放大了三倍。從圖檔中能夠清楚的看到。

效率:

         比較像素數量減少方式效率的代碼,在本文的最後面,代碼看上去非常多,事實上結構比較簡單,看一會兒就明确了。附上一張結果圖:

OpenCV, color reduction method

最快的OpenCV内的LUT函數。關于LUT,看​​這裡​​

能夠粗略的看一下代碼,代碼不難,非常easy懂: