OpenCV-矩阵归一化cv::normalize

简介: OpenCV-矩阵归一化cv::normalize

函数原型

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

参数说明

InputArray类型的src,输入图像,如Mat类型。

OutputArray类型的dst,输出图像。

double类型的alpha,归一化相关的数值。

double类型的beta,归一化相关的数值。

int类型的norm_type,归一化类型。

int类型的dtype,默认值-1,与输出矩阵的类型和通道相关。

InputArray类型的mask,掩膜。

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


NORM_MINMAX :alpha和beta的最大值是归一化的最大值,两者的最小值是归一化的最小值,alpha为1,beta为0,同alpha为0,beta为1,是一致的。

NORM_INF:beta值无用;输出矩阵的数值为,原始矩阵数值除以矩阵最大值的结果,alpha可以控制倍数

  1. NORM_L1:beta值无用;输出矩阵的数值为,原始矩阵数值除以矩阵数据绝对值和的结果,alpha可以控制倍数。
  2. NORM_L2:beta值无用;输出矩阵的数值为,原始矩阵数值除以矩阵数据平方和再开根号的结果,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函数不同归一化模式结果,与按公式输出结果对比,数值完全一致。

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

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

相关文章
|
4月前
|
机器学习/深度学习 人工智能 算法
Python在计算机视觉(CV)中扮演重要角色,得益于其丰富的库如OpenCV、Pillow和Scikit-image。
【7月更文挑战第5天】Python在计算机视觉(CV)中扮演重要角色,得益于其丰富的库如OpenCV、Pillow和Scikit-image。CV涉及图像处理、模式识别和机器学习,用于图像理解和生成。Python的跨平台特性和活跃社区使其成为CV的理想工具。基本流程包括图像获取、预处理、特征提取、分类识别及图像生成。例如,面部识别通过预处理图像,使用如`cv2.CascadeClassifier`进行检测;物体检测类似,但需适应不同目标;图像生成则利用GAN创造新图像。
68 4
|
3月前
|
计算机视觉 索引
OpenCV读取视频失败<无可用信息,未为 opencv_world453.dll 加载任何符号> cv::VideoCapture
本文介绍了解决OpenCV读取视频失败的错误,指出问题通常由视频路径错误或摄像头索引错误导致,并提供了相应的解决方法。
OpenCV读取视频失败<无可用信息,未为 opencv_world453.dll 加载任何符号> cv::VideoCapture
|
3月前
|
计算机视觉
OpenCV 图像类型标识符 CV_<bit_depth><S|U|F>C<number_of_channels>
OpenCV 图像类型标识符 CV_<bit_depth><S|U|F>C<number_of_channels>
38 0
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 直方图计算 split/calcHist/normalize】
【Qt&OpenCV 直方图计算 split/calcHist/normalize】
48 0
|
计算机视觉
OpenCV-模板匹配cv::matchTemplate
OpenCV-模板匹配cv::matchTemplate
104 0
|
6月前
|
计算机视觉
OpenCV报错: cv::Exception,位于内存位置 0x00000078226FEE58 处。
OpenCV报错: cv::Exception,位于内存位置 0x00000078226FEE58 处。
|
6月前
|
存储 定位技术 计算机视觉
Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换
Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换
|
6月前
|
计算机视觉 Python
opencv cv::Range()和cv::Rect()用于crop来获得感兴趣区域
opencv cv::Range()和cv::Rect()用于crop来获得感兴趣区域
225 0
|
计算机视觉
openCV之单应性矩阵
单应性矩阵
115 1
|
算法 计算机视觉
OpenCV-漫水填充cv::floodFill
OpenCV-漫水填充cv::floodFill
183 0