RGB歸一化及高效實現

2021-10-10 13:36:47 字數 2928 閱讀 7491

在影象處理中,rgb顏色模型是比較常用的格式,但是其存在乙個明顯的缺點:容易受到光照變化或陰影的影響,也就是說,同一位置,不同光照強度會導致影象的rgb值發生很大變化.

而通過對影象的rgb色彩空間進行歸一化處理,在某些情況下是去除光照和陰影影響的一種簡單和有效的方法.

假設影象上某點的的畫素值為rgb,rgb表示歸一化之後的值,那麼rgb歸一化的公式表示如下:

r =r

r+g+

bg=g

r+g+

bb=b

r+g+

b(or

b=1−

r−g)

r=\frac \\ g=\frac \\ b=\frac (or\ b=1-r-g)

r=r+g+

br​g

=r+g

+bg​

b=r+

g+bb

​(or

b=1−

r−g)

從公式可以看到:

1.歸一化之後的影象僅使用兩個位元組便可以表示乙個畫素值

2.當某個畫素受光照或陰影的影響而產生顏色通道r、g、b上的scale變化的話,則通過歸一化操作,可以消除這樣的影響.

rgb歸一化如何能消除光照影響?

舉個例子:

t1時刻的畫素a的畫素值為:rgb(30, 60, 90),歸一化後的值為(1/6,1/3,2/3)

t2時刻的畫素a的畫素值為:rgb(60, 120, 180)(受光照影響,r/g/b三個顏色通道的value產生了變化),歸一化後的值為(1/6,1/3,2/3)

顯然,t1時刻和t2時刻,畫素a的歸一化rgb值沒有發生變化,可以看到,歸一化rgb的好處在於,

當某個畫素受光照或陰影的影響而產生顏色通道rgb上的scale變化的話,則通過歸一化操作,可以消除這樣的影響.

插乙個概念,影象歸一化就是通過一系列變換(即利用影象的不變矩尋找一組引數使其能夠消除其他變換函式對影象變換的影響),

將待處理的原始影象轉換成相應的唯一標準形式(該標準形式影象對平移、旋轉、縮放等仿射變換具有不變特性).

類推,我們可以將光照或者陰影看做乙個變換函式,該函式和影象函式相作用,那麼rgb歸一化的目的即是為了消除變換函式對原本函式的影響.

物理上,這種變換方式從影象上移除了光照的資訊.

說明:

1.歸一化rgb對於灰色(r=g=b)或黑色畫素存在問題

原因:當某個畫素的r=g=b時,如果由於光照變化影響其r/g/b三個通道值分別發生了變化,但是變化後值仍然為:r』 = g』 = b』,那麼對它們的歸一化是不起作用的(由歸一化公式可知).

2.歸一化rgb並不能去除所有型別的光照或陰影產生的影響

原因:由歸一化rgb的公式可知,其只對r/g/b三個通道值發生scale變化(即 scale = r』/r = g』/g = b』/b)的情況時具有光照不變性.

3.歸一化後,陰影區域藍色分量偏高

原因:phong光照模型,陰影區域的三個通道中,r通道下降最多,g通道次之,b通道下降最少,這相當於增加了陰影區域的藍色分量

根據rgb歸一化公式,可以很輕鬆實現對一幅影象進行rgb歸一化的**:直接遍歷各個畫素點,然後對各畫素點進行求值即可.**如下:

//

// created by liheng on 11/13/20.

//#include #include //rgb歸一化

//input param:_src--輸入影象,cv_8uc3

//output param:dst--歸一化後的影象,type as src

//return: null

void normalizergb1(const cv::mat& _src,cv::mat& dst)

//將結果量化到[0,255]範圍

//norm_minmax表示線性量化,cv_8uc3表示將影象轉回

cv::normalize(src,src,0,255,cv::norm_minmax);

cv::convertscaleabs(src,dst);

}

上述**採用迭代器對各畫素進行遍歷,注意進行歸一化操作時出現分母為0的情況(r=g=b=0),因此分母額外加了乙個微小的量.

上面的實現過程採用遍歷實現,可能會比較耗時.思考rgb歸一化公式,我們可以借助於矩陣運算公式,通過矩陣來實現上述過程,

借助與opencv對矩陣運算的優化,來加速上述過程,實現**如下:

//rgb歸一化

//input param:_src--輸入影象,cv_8uc3

//output param:dst--歸一化後的影象,type as src

//return: null

void normalizergb(const cv::mat &_src, cv::mat &dst)

此處有一張含有陰影的影象,如下圖所示.採用上面2種方式進行rgb歸一化,並觀察陰影去除效果:

**示例:

#include int main()

耗時分析:耗時情況在**中已註明.在release模式下,兩種方式差別不明顯.

rgb歸一化結果如下(2種實現下結果一致):

1.基於歸一化rgb色彩模型的陰影處理方法,楊俊,趙忠明

2.opencv rgb歸一化

3.rgb顏色模型歸一化

js實現資料歸一化

1 資料歸一化是對原始資料的線性變換,使結果值對映到 0 1 之間。轉換函式如下 其中max為樣本資料的最大值,min為樣本資料的最小值。2 js實現資料歸一化 distributioninfo 獲取最大值 function getmaxv distributioninfo return max 獲...

特徵歸一化的方法 線性歸一化 零均值歸一化

常用歸一化方法 1 線性歸一化,線性歸一化會把輸入資料都轉換到 0 1 的範圍,公式如下 該方法實現對原始資料的等比例縮放,其中xnorm為歸一化後的資料,x為原始資料,xmax xmin分別為原始資料集的最大值和最小值。優點 通過利用變數取值的最大值和最小值將原始資料轉換為界於某一特定範圍的資料,...

利用scikit learn實現資料歸一化

本文主要介紹scikit learn中的資料預處理之歸一化。import numpy as np from sklearn import preprocessing 定義array a np.array 10,2.3,13.7,56,108 print a 對array進行歸一化 normaliza...