OpenCV學習筆記(5)——normalize函式

Lavi_qq_2910138025發表於2020-04-05
函式原型:

void normalize(InputArray src,OutputArraydst,double alpha=1,double beta=0,
intnorm_type=NORM_L2,int dtype=-1,InputArray mask=noArray());
函式功能:

該函式歸一化輸入陣列使它的範數或者數值範圍在一定的範圍內。
引數說明:
src:
輸入陣列dst:輸出陣列,支援原地運算
alpha:range normalization模式的最小值
beta:range normalization模式的最大值,不用於norm normalization(範數歸一化)模式。
normType:歸一化的型別,可以有以下的取值:
    NORM_MINMAX:陣列的數值被平移或縮放到一個指定的範圍,線性歸一化,一般較常用。
    NORM_INF:此型別的定義沒有查到,根據opencv 1的對應項,可能是歸一化陣列的C-範數(絕對值的最大值)
    NORM_L1 :  歸一化陣列的L1-範數(絕對值的和)
    NORM_L2: 歸一化陣列的(歐幾里德)L2-範數
dtype:dtype為負數時,輸出陣列的type與輸入陣列的type相同;否則,輸出陣列與輸入陣列只是通道數相同,而tpye=CV_MAT_DEPTH(dtype).
mask:操作掩膜,用於指示函式是否僅僅對指定的元素進行操作。
歸一化公式:
1、norm_type=NORM_MINMAX,NORM_MINMAX對應線性函式轉換,表示式如下
if mask(i,j)!=0
    dst(i,j) = (src(i,j) - min(src)) * (b' - a') / (max(src) - min(src)) +  a'
else
    dst(i,j) = src(i,j)
其中b' = MAX(alpha,beta ) , a' = MIN(alpha,beta );
2. 當norm_type!=NORM_MINMAX:(關於此處怎樣將輸入矩陣的範數歸一化到一定範圍我還不是很明白,希望明白的可以指點一下)
if mask(i,j) != 0
    dst(i,j) = src(i,j) *alpha / norm (src,norm_type,mask)
else
    dst(i,j) = src(i,j)
其中,函式norm的功能是計算norm(範數)的絕對值,

The functions norm calculate an absolute norm of src1 (when there is no src2 ):範數的計算如下:


歸一化定義與作用
    歸一化就是要把需要處理的資料經過處理後(通過某種演算法)限制在你需要的一定範圍內。首先歸一化是為了後面資料處理的方便,其次是保證程式執行時收斂加快。歸一化的具體作用是歸納統一樣本的統計分佈性。歸一化在0-1之間是統計的概率分佈,歸一化在某個區間上是統計的座標分佈。歸一化有同一、統一和合一的意思。
    歸一化的目的簡而言之,是使得沒有可比性的資料變得具有可比性,同時又保持相比較的兩個資料之間的相對關係,如大小關係;或是為了作圖,原來很難在一張圖上作出來,歸一化後就可以很方便的給出圖上的相對位置等。
    在使用機器學習演算法的資料預處理階段,歸一化也是非常重要的一個步驟。例如在應用SVM之前,縮放是非常重要的。Sarle的神經網路FAQ的第二部分(1997)闡述了縮放的重要性,大多數注意事項也適用於SVM。縮放的最主要優點是能夠避免大數值區間的屬性過分支配了小數值區間的屬性。另一個優點能避免計算過程中數值複雜度。因為關鍵值通常依賴特徵向量的內積(inner products),例如,線性核和多項式核,屬性的大數值可能會導致數值問題。我們推薦將每個屬性線性縮放到區間[-1,+1]或者[0, 1]。
    當然,我們必須使用同樣的方法縮放訓練資料和測試資料。例如,假設我們把訓練資料的第一個屬性從[-10,+10]縮放到[-1, +1],那麼如果測試資料的第一個屬性屬於區間[-11, +8],我們必須將測試資料轉變成[-1.1, +0.8]。
參考:“SVM:從理論到OpenCV實踐” 4.2 歸一化資料:http://blog.csdn.net/zhazhiqiang/article/details/20146243

來源:http://blog.csdn.net/solomon1558/article/details/44689611

相關文章