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取代。這樣的轉換方案能夠用以下的公式表示
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SO4ITMhhjZjljYyAzYkNWO4EWN5QGMhBzN2YTY5UDZz8CX0AzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL2M3Lc9CX6MHc0RHaiojIsJye.png)
通過上面的公式,把全部像素點的值更新一下。可是,上面的公式中有除法,這裡要表達一個是,計算量比較多的情況下,不用乘除,就不要用,最好把他們轉換為加減。我們知道,在轉換前像素點的值僅僅有256個,是以我們能夠用查找表的方式,我們事先把全部的計算結果都儲存在一個數組裡,每次要運作上面的公式計算的時候,結果直接從數組裡取出來就ok了。比方32相應30,表table[32]=30是早計算出來的,直接訪問table[32]就OK了。
圖檔矩陣怎樣在記憶體中存儲的:
灰階圖檔的矩陣存儲方式:
灰階圖檔的每個像素點,僅僅由一個值來表示,是以,就是一個普通的二維矩陣。
彩色圖檔的矩陣存儲方式:
彩色圖檔的存儲方式和灰階圖檔不一樣,這裡展示的是RGB格式的,能夠看到,每個像素,由三個值,代表藍色,綠色,紅色的三個數值表示,存儲方式不是三維的,而是二維,隻是列向量放大了三倍。從圖檔中能夠清楚的看到。
效率:
比較像素數量減少方式效率的代碼,在本文的最後面,代碼看上去非常多,事實上結構比較簡單,看一會兒就明确了。附上一張結果圖:
最快的OpenCV内的LUT函數。關于LUT,看這裡
能夠粗略的看一下代碼,代碼不難,非常easy懂: