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]區間.

代碼:
#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

轉自:http://www.opencv.org.cn/forum/viewtopic.php?t=7577
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章