• 归一化


    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 ";

    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 返回计算所得的范数。多通道数组被视为单通道处理,因此,所有通道的结果是结合在一起的。

  • 相关阅读:
    MySQL GROUP BY多个字段分组用法详解
    Linux下自动备份MySQL数据库并上传到远程FTP服务器
    mysql服务器主从数据库同步配置(转)
    centos上安装配置java WEB环境_java(转)
    Win7和Vista的安全机制对于应用程序读取配置文件相关操作的影响(虚拟重定向技术)
    firemonkey 手机屏幕自适应程序问题
    Delphi中无边框窗体应用程序使任务栏右键菜单有效的方法
    GetClass与RegisterClass的应用一例
    Delphi中的动态包,有详细建立包的步骤(答案很简单:因为包的功能强大)
    JS开发调试
  • 原文地址:https://www.cnblogs.com/linchenjian/p/6399545.html
Copyright © 2020-2023  润新知