OpenCV-矩阵归一化cv::normalize

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

函数原型

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

参数说明

  1. InputArray类型的src,输入图像,如Mat类型。
  2. OutputArray类型的dst,输出图像。
  3. double类型的alpha,归一化相关的数值。
  4. double类型的beta,归一化相关的数值。
  5. int类型的norm_type,归一化类型。
  6. int类型的dtype,默认值-1,与输出矩阵的类型和通道相关。
  7. InputArray类型的mask,掩膜。

针对第三个参数alpha和第四个参数beta,在不同归一化类型时,作用不一样:

  1. NORM_MINMAX :alpha和beta的最大值是归一化的最大值,两者的最小值是归一化的最小值,alpha为1,beta为0,同alpha为0,beta为1,是一致的。
  2. NORM_INF:beta值无用;输出矩阵的数值为,原始矩阵数值除以矩阵最大值的结果,alpha可以控制倍数。Output=\frac{Input}{max(Input)}*alpha
  3. NORM_L1:beta值无用;输出矩阵的数值为,原始矩阵数值除以矩阵数据绝对值和的结果,alpha可以控制倍数。Output=\frac{Input}{\sum|Input|}*alpha
  4. NORM_L2:beta值无用;输出矩阵的数值为,原始矩阵数值除以矩阵数据平方和再开根号的结果,alpha可以控制倍数。Output=\frac{Input}{\sqrt{\sum(Input)^{2}}}*alpha

测试代码

#include<iostream>
#include<opencv2/opencv.hpp>
#include<ctime>
using namespace std;
using namespace cv;
int main(void)
{
	cv::Mat test = (Mat_<float>(4, 4) << 1, 2, 3, 4, 5, 6, 2, 4, 5, 6, 1, 4, 2, 7, 8, 6);
	cout <<" "<< "T=" << endl << " " << test << endl << endl;
	cv::Mat inf, L1, L2, MinMax,inf_,L1_,L2_,MinMax_;

	cv::normalize(test, MinMax, 0, 1, NORM_MINMAX);
	double min=0, max=0;
	cv::minMaxLoc(test, &min, &max,0,0);
	MinMax_ = (test - min) * 1 / (max - min);
	cout << " " << "MinMax=" << endl << " "  << MinMax << endl;
	cout << " " << "MinMax_=" << endl << " " << MinMax_ << endl << endl;

	cv::normalize(test, inf, 10, 0, NORM_INF);
	double  max1 = 0;
	cv::minMaxLoc(test, 0, &max1, 0, 0);
	inf_ = test * 10 / max;
	cout << " " << "inf=" << endl << " "  << inf << endl;
	cout << " " << "inf_=" << endl << " "  << inf_ << endl << endl;

	cv::normalize(test, L1, 10, 0, NORM_L1);
	cv::Mat abs_;
	float sum_ = 0.0f;
	abs_=cv::abs(test);
	sum_ = cv::sum(abs_)[0];
	L1_ = test *10 / sum_;
	cout << " " << "L1=" << endl << " "  << L1 << endl;
	cout << " " << "L1_=" << endl << " "  << L1_ << endl << endl;

	cv::normalize(test, L2, 10, 0, NORM_L2);
	cv::Mat pow_;
	float sum1_ = 0.0f;
	float sqrt_ = 0.0f;
	cv::pow(test,2,pow_);
	sum1_ = cv::sum(pow_)[0];
	sqrt_ = sqrt(sum1_);
	L2_ = test * 10 / sqrt_;
	cout << " " << "L2=" << endl <<" "  << L2 << endl;
	cout << " " << "L2_=" << endl << " "  << L2_ << endl << endl;

	system("pause");
	return 0;
}

测试效果

图1 验证结果对比图

       从图中可以看出:直接调用normalize函数不同归一化模式结果,与按公式输出结果对比,数值完全一致。

       如果该函数有什么我没发现的问题,欢迎评论区批评指正~

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翟天保Steven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值