歸一化


cvNormalize函數
void cvNormalize( const CvArr* src, CvArr* dst,
double a=1, double b=0, int norm_type=CV_L2,
const CvArr* mask=NULL );

 

cvNormalize函數(續)

Normalize

根據某種范數或者數值范圍歸一化數組.

 

void cvNormalize( const CvArr* src, CvArr* dst,

double a=1, double b=0, int norm_type=CV_L2,

const CvArr* mask=NULL );

src

輸入數組

dst

輸出數組,支持原地運算

a

輸出數組的最小/最大值或者輸出數組的范數

b

輸出數組的最大/最小值

norm_type

歸一化的類型,可以有以下的取值:

CV_C - 歸一化數組的C-范數(絕對值的最大值)

CV_L1 - 歸一化數組的L1-范數(絕對值的和)

CV_L2 - 歸一化數組的(歐幾里德)L2-范數

CV_MINMAX - 數組的數值被平移或縮放到一個指定的范圍

mask

操作掩膜,用於指示函數是否僅僅對指定的元素進行操作

該函數歸一化輸入數組使它的范數或者數值范圍在一定的范圍內

 

對於不同的norm_type, 根據我的試驗(mask=null)的時候, a,b(a>b)起的作用結果如下:

norm_type=CV_C時, src 被重新"縮放"(rescale)到dst, 使得dst的值是線性映射到[0,1]區間.(a,b其實無作用)

norm_type=CV_L1,或者 CV_L2時, 得到L1,L2規范化的dst.(a,b其實無作用)

norm_type=CV_MINMAX時, src會被縮放(rescale)和移動(translation)到dst,使得dst的值是線性映射到[b,a]區間.

 

cvNormalize函數(續)

代碼:

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

#include <cv.h>

#include <cxcore.h>

#include <highgui.h>

 

void displayMat(const CvMat* mat){

int col=mat->width;

int row=mat->height;

double* data=mat->data.db;

for(int i=0;i<row;i++){

for(int j=0;j<col;j++){

std::cout<<data[i*col+j]<<", ";

}

}

std::cout<<std::endl;

}

int main (int argc, char * const argv[]) {

// insert code here...

std::cout << "normalization\n";

 

double data[]={1,4,5,6,7,10};

 

CvMat src=cvMat(6,1,CV_64FC1,data);

CvMat dst=cvMat(6,1,CV_64FC1,data);

 

std::cout<<"a=5,b=0: ";cvNormalize(&src,&dst,5,0,CV_C,NULL);

displayMat(&dst);std::cout<<"---------"<<std::endl;

 

std::cout<<"a=5,b=0: ";cvNormalize(&src,&dst,5,0,CV_L1,NULL);

displayMat(&dst);std::cout<<"---------"<<std::endl;

 

std::cout<<"a=5,b=0: ";cvNormalize(&src,&dst,5,0,CV_L2,NULL);

displayMat(&dst);std::cout<<"---------"<<std::endl;

 

std::cout<<"a=5,b=0: ";cvNormalize(&src,&dst,5,0,CV_MINMAX,NULL);

displayMat(&dst);std::cout<<"---------"<<std::endl;

 

return 0;

}

 

當cvMat={1,4,5,6,7,10}, a=5,b=0的時候,輸出結果如下:

a=5,b=0: CV_C: 0.1, 0.4, 0.5, 0.6, 0.7, 1,

---------

a=5,b=0: CV_L1: 0.030303, 0.121212, 0.151515, 0.181818, 0.212121, 0.30303,

---------

a=5,b=0: CV_L2: 0.0663723, 0.265489, 0.331862, 0.398234, 0.464606, 0.663723,

---------

a=5,b=0: CV_MINMAX: 0, 1.66667, 2.22222, 2.77778, 3.33333, 5,

---------

L1_norm: 每個元素乘上1/sqrt(1+4+5+6+7+10)

L2_norm: 每個元素乘上1/sqrt(1+16+25+36+49+100)

CV_MINMAX:使每個元素限制在[a=5,b=0]之間算法如下:dst(i)=(src(i)-min(src))*(5-0)/(max(src)-min(src))

1-->0

4-->3*5/9=1.6666

5-->4*5/9=2.2222

 

opencv中關於cvNorm函數的使用

Norm

 

計算數組的絕對范數, 絕對差分范數或者相對差分范數

 

double cvNorm( const CvArr* arr1, const CvArr* arr2=NULL, int norm_type=CV_L2, const CvArr* mask=NULL );

 

opencv中關於cvNorm函數的使用(續)

參數:

 

arr1             第一輸入圖像

 

arr2             第二輸入圖像 ,如果為空(NULL), 計算 arr1 的絕對范數,否則計算 arr1-arr2 的絕對范數或者相對范數。

normType  范數類型,參見“討論”。

mask          可選操作掩模。

如果 arr2 為空(NULL),函數 cvNorm 計算 arr1 的絕對范數:

 

norm = ||arr1||C = maxI abs(arr1(I)), 如果 normType = CV_C

norm = ||arr1||L1 = sumI abs(arr1(I)), 如果 normType = CV_L1

norm = ||arr1||L2 = sqrt( sumI arr1(I)2), 如果 normType = CV_L2

 

如果 arr2 不為空(NULL), 該函數計算絕對差分范數或者相對差分范數:

 

norm = ||arr1-arr2||C = maxI abs(arr1(I)-arr2(I)), 如果 normType = CV_C

norm = ||arr1-arr2||L1 = sumI abs(arr1(I)-arr2(I)), 如果 normType = CV_L1

norm = ||arr1-arr2||L2 = sqrt( sumI (arr1(I)-arr2(I))2 ), 如果 normType = CV_L2

或者

 

norm = ||arr1-arr2||C/||arr2||C, 如果 normType = CV_RELATIVE_C

norm = ||arr1-arr2||L1/||arr2||L1, 如果 normType = CV_RELATIVE_L1

norm = ||arr1-arr2||L2/||arr2||L2, 如果 normType = CV_RELATIVE_L2

函數 Norm 返回計算所得的范數。多通道數組被視為單通道處理,因此,所有通道的結果是結合在一起的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM