zoukankan      html  css  js  c++  java
  • 【编程开发】opencv实现对Mat中某一列或某一行的元素进行normalization

    【编程开发】opencv实现对Mat中某一列或某一行的元素进行normalization

    标签: 【编程开发】 【机器学习】


    声明:引用请注明出处http://blog.csdn.net/lg1259156776/


    说明:在机器学习中,最常见的处理就是对输入的特征向量进行normalization,在opencv中就实现了normalize函数进行各种normalization,本文结合我的实际应用来进行说明。


    代码实现

    首先参看代码:

    /*normalized*/
        Mat dataCol;
        for (int j=0; j<len; j++)
        {   
            dataCol = FeatureValue.colRange(j,j+1).clone();
            normalize(dataCol,dataCol);
            for (int i=0; i<Num; i++)
            {
                FeatureValue.at<float>(i,j) = dataCol.at<float>(i,0);//log(abs(dataCol.at<float>(i,0)));
            }
        }
    

    上面的一段代码实现的是对Mat中某一列元素进行normalization,实现的是L2范数的normalization。

    Mat取行或列

    首先opencv Mat中如何取出某一行或某几行,某一列或某几列呢?

    Mat dataCol;
    dataCol = FeatureValue.colRange(j,j+1).clone();
    

    直接使用Mat类中成员函数,方法,colRange对应的是列,rowRange对应的是行,从第j列(下标从0开始)到第j列,也就是说只取出第j列而已。后面的clone表示深拷贝,不使用clone表示浅拷贝。

    深拷贝与浅拷贝

    浅拷贝的说明如下:

    Mat B;  
    B = image  // 第一种方式  
    Mat C(image); // 第二种方式
    

    这两种方式称为浅copy,是由于它们有不同的矩阵头,但是它们共享内存空间,即指向一个矩阵。当图像矩阵发生变化时,两者相关联,都会变化。
    深拷贝的说明如下:

    Mat B,C;  
    B = image.clone();       // 第一种方式  
    image.copyTo(C); // 第二种方式  
    

    深拷贝是真正的copy了一个新的图像矩阵,此时image,B,C三者相互没有影响。

    normalize函数说明

    函数原型:

    void normalize(InputArray src,OutputArray dst, double alpha=1, double beta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray() )
    

    该函数归一化输入数组使它的范数或者数值范围在一定的范围内。

    Parameters的说明如下:

    • src:输入数组
    • dst:输出数组,支持原地运算inplace操作
    • alpha:range normalization模式的最小值
    • beta:range normalization模式的最大值,不用于norm normalization(范数归一化)模式。
    • normType:归一化的类型,可以有以下的取值:
    NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。
    NORM_INF: 此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)
    NORM_L1 :  归一化数组的L1-范数(绝对值的和)
    NORM_L2: 归一化数组的(欧几里德)L2-范数
    

    可能最常见的要数NORM_L2和NORM_MINMAX。

    • dtype:dtype为负数时,输出数组的type与输入数组的type相同;否则,输出数组与输入数组只是通道数相同,而tpye=CV_MAT_DEPTH(dtype).
    • mask:操作掩膜,用于指示函数是否仅仅对指定的元素进行操作。

    1、线性函数转换,表达式如下:(对应NORM_MINMAX)

    ifmask(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(a,b), a‘=MIN(a,b);

    1. 当norm_type!=CV_MINMAX:

      ifmask(i,j)!=0
      dst(i,j)=src(i,j)*a/norm (src,norm_type,mask)
      else
      dst(i,j)=src(i,j)

    其中,函数norm的功能是计算norm(范数)的绝对值

    Thefunctions norm calculate an absolute norm of src1 (when there is no src2 ):
    此处输入图片的描述


    2015-11-06 调试记录 张朋艺

  • 相关阅读:
    c#web中定义全局变量,传递变量
    关于Dropdownlist 与 autopostBack 问题多级联动 例 省/市/区
    发布附件应用小研究
    dell更换同型号的主板注意
    dotnet文本编辑器控件的应用
    小结解决双网卡网关问题(route add p) 关于静态路由
    读取数据表中符合条件的记录和数目
    密码最短长度为 7,其中必须包含以下非字母数字字符: 1(转)
    Hibernate 中的核心接口与类
    什么是整洁的代码(Clean Code)?
  • 原文地址:https://www.cnblogs.com/huty/p/8518953.html
Copyright © 2011-2022 走看看