嚴格來說這篇文章與 iOS SDK 並沒有太大的關係,因為使用圖學的方法求出影像的亮度,可以應用於電腦圖學上的任何地方,但是基於 iOS SDK 中所提供的 API,並未能夠讓我們控制相機的光圈或是環境光源感應器 Proximity 的詳細參數,因此在實作上,若要取得目標影像的平均亮度,還是得仰賴圖學的原理。
演算法
首先,我們得把目標影像從 RGB Color Model 色域轉換成能表達亮度形式的 Grayscale Model 灰階影像,參考維基百科得知 RGB 轉換成灰階影像的演算法如下。
灰階像素(亮度)= 紅色像素 *0.299 + 綠色像素 *0.587 + 藍色像素 *0.114
最後,再把整張影像的灰階像素加起來取平均值,就可以得出目標影像的亮度值(0 ~ 255),你也可以將此亮度數值正規化(除以 255)在 0 ~ 1之間。
//pseudo code
for (int i=0; i!=圖寬*圖高; i++) {
總亮度值 += 影像灰階像素[i];
}
平均亮度值 = 總亮度值 / 圖寬*圖高;
補充說明
- 參考影像與資料陣列的轉換(上)或影像與資料陣列的轉換(下)來取得目標影像資料的 RGB 數值。
- 圖片格式中的透明度(Alpha)並不會影像影像的亮度,在計算上應考慮到這點。
- 灰階像素一個比較主觀的求法,是將 RGB 三色相加並除以三求其平均,使其三色所佔的比重皆相等,但是基於考慮到人類眼睛對於顏色的敏感度的條件下,使用上述的求解方式會比較客觀。
- 其餘色彩空間像是 YUV 等具有亮度表示的色彩模型,也同樣適用。
沒有留言:
張貼留言