cvNormalize用法

来源:互联网 发布:犀牛软件无法选取 编辑:程序博客网 时间:2024/06/03 21:14

根据某种范数或者数值范围归一化数组.

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 <cv.h>#include <highgui.h>#include <iostream>using namespace cv;void main(){    float A[] = {1 , 2 , 3 , 4} ;    CvMat mat_A = cvMat(1 , 4 , CV_32FC1 , A) ;    for (int i = 0 ; i < 4 ; i++)    {        std::cout<<cvGetReal2D(&mat_A , 0 , i)<<"\t" ;    }    std::cout<<"\n" ;    CvMat *mat_dst = cvCreateMat(1 , 4 , CV_32FC1) ;    //归一化数组C-范数(绝对值的最大值)    cvNormalize(&mat_A , mat_dst , 1.0 , 0.0 , CV_C) ;    for (int i = 0 ; i < 4 ; i++)    {        std::cout<<cvGetReal2D(mat_dst , 0 , i)<<"\t" ;    }    std::cout<<"\n" ;    //归一化数组的L1-范数(绝对值的和)    cvNormalize(&mat_A , mat_dst , 1.0 , 0.0 , CV_L1) ;    for (int i = 0 ; i < 4 ; i++)    {        std::cout<<cvGetReal2D(mat_dst , 0 , i)<<"\t" ;    }    std::cout<<"\n" ;    //归一化数组(欧几里得)L2范数    cvNormalize(&mat_A , mat_dst , 1.0 , 0.0 , CV_L2) ;    for (int i = 0 ; i < 4 ; i++)    {        std::cout<<cvGetReal2D(mat_dst , 0 , i)<<"\t" ;    }    std::cout<<"\n" ;    //数组的值被平移或缩放到指定的一个范围    cvNormalize(&mat_A , mat_dst , 1.0 , 0.0 , CV_MINMAX) ;    for (int i = 0 ; i < 4 ; i++)    {        std::cout<<cvGetReal2D(mat_dst , 0 , i)<<"\t" ;    }    std::cout<<"\n" ;}
0 0
原创粉丝点击