您的位置:首页 > 运维架构

OpenCV中矩阵的归一化 normalize函数实例详解

2018-12-04 11:43 531 查看

下面自己写的文档函数介绍部分参考了这2篇博客:

     https://www.geek-share.com/detail/2701090505.html

     https://blog.csdn.net/solomon1558/article/details/44689611

    自叙:第一次写博客,本来不想写,但网上对于这个归一化函数实例部分函数讲解部分没有十分清晰的博客。所以才有了这一篇博客。

     本来想直接上代码的,但考虑到文章的完整性所以把函数介绍又重写了一遍,整理一上午搞定的,我觉得你只要认真看

完全就这一篇博客就能搞定。

1.函数原型

void cv::normalize(InputArry src,InputOutputArray dst,double alpha=1,double beta=0,int norm_type=NORM_L2,int                                                         dtype=-1,InputArray mark=noArry())
 

2.函数作用
归一化数据。该函数分为范围归一化与数据值归一化。(Normalizes the norm or value range of an array.)

3.参数说明
src               输入数组;
dst               输出数组,数组的大小和原数组一致;
alpha           可以用来规范值,也可以用来规范范围,并且是范围的下限;
beta             只用来规范范围并且是范围的上限;
norm_type   归一化选择的数学公式类型;
dtype           当为负,输出在大小深度通道数都等于输入,当为正,输出只在深度与输如不同,不同的地方游dtype决定;
mark            掩码。选择感兴趣区域,选定后只能对该区域进行操作。
 

4:归一化的类型norm_type   ,可以有以下的取值:

    NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。                                          0

    NORM_INF: 此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)              1

    NORM_L1 :  归一化数组的L1-范数(绝对值的和)                                                                                                              2

    NORM_L2: 归一化数组的(欧几里德)L2-范数                                                                                                                   3
 

5.归一化公式:  

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

if mask(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(alpha,beta ) , a' = MIN(alpha,beta );

2. 当norm_type!=NORM_MINMAX:

if mask(i,j) != 0

    dst(i,j) = src(i,j) *alpha / norm (src,norm_type,mask)

else

    dst(i,j) = src(i,j)

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

L1范数:

L2范数:

NORM_INF的范数:     Max(src(x,y))

6:下面是代码的实际验证:

#include <iostream>
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;

 

int main()
{
cout << "NORM_L2模式:"<<endl;
cv::Mat ima1(1, 3, CV_32F, cv::Scalar(4));
cv::normalize(ima1, ima1); // NORM_L2模式
cout << ima1 << endl;
cout << endl;

 

cout << "看着是NORM_L1模式,实际还是NORM_L2的模式,此时alpa=2:"<<endl;
cv::Mat ima2(1, 3, CV_32F, cv::Scalar(4));
cv::normalize(ima2, ima2,cv::NORM_L1); // 看着是NORM_L1模式,实际是alpa=2,norm_type等于默认值的模式
cout << ima2 << endl;
cout << endl;

 

cout << "看着是NORM_INF模式,实际还是NORM_L2的模式,此时alpa=1:"<<endl;
cv::Mat ima3(1, 3, CV_32F, cv::Scalar(4));
cv::normalize(ima3, ima3, cv::NORM_INF); // 看着是范围模式,实际是NORM_L2模式。因为NORM_INF的int值是1,此时函数里面相当于alpa=1,而类型还是默认值
cout << ima3 << endl;
cout << endl;

 

cout << "NORM_L1模式:"<<endl;
cv::Mat ima4(1, 3, CV_32F, cv::Scalar(4));
cv::normalize(ima4, ima4,1,0, cv::NORM_L1); // 这才是norm_L1模式
cout << ima4 << endl;
cout << endl;

 

cout << "NORM_INF模式:"<<endl;
cv::Mat ima5(1, 3, CV_32F, cv::Scalar(4));
cv::normalize(ima5, ima5, 1, 0, cv::NORM_INF); // 这才是norm_L1模式
cout << ima5 << endl;
cout << endl;

 

cout << "范围模式:" << endl;
cv::Mat ima6(1, 3, CV_32F, cv::Scalar(4));
ima6.at<float>(0, 0) = 5;
cv::normalize(ima6, ima6, 1, 0, cv::NORM_MINMAX); // 这才是norm_L1模式
cout << ima6 << endl;
cout << endl;
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: