OpenCV中矩阵的归一化 normalize函数实例详解
下面自己写的文档函数介绍部分参考了这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;
}
- OpenCV中矩阵的归一化*(Normalize函数)
- OpenCV矩阵的归一化和欧式距离详解
- OpenCV学习之CvMat的用法详解及实例
- OpenCV自适应阈值化函数adaptiveThreshold详解,并附实例源码!
- OpenCV中矩阵类详解:CvMat,Mat和IplImage之间的转化和拷贝
- OpenCV中矩阵的归一化
- OpenCV学习之CvMat的用法详解及实例
- OpenCV2中矩阵的归一化 normalize函数详解
- OpenCv实现卷积神经网络实例:tiny_cnn代码详解(6)——average_pooling_layer层结构类分析
- OpenCV学习之CvMat的用法详解及实例(二)
- OpenCV学习之CvMat的用法详解及实例(二)
- OpenCV学习之CvMat的用法详解及实例(三)
- 【OpenCV】CvMat的用法详解及实例
- OpenCV学习之CvMat的用法详解及实例(三)
- OpenCV中矩阵的归一化
- OpenCV学习之CvMat的用法详解及实例
- OpenCV学习之CvMat的用法详解及实例
- OpenCV中矩阵的归一化
- C语言实现opencv提取直线、轮廓及ROI实例详解
- C语言 经典题目螺旋矩阵 实例详解