Opencv C++ 归一化

举报
风吹稻花香 发表于 2021/06/05 22:14:03 2021/06/05
【摘要】   c++默认是uint8,uchar类型,归一化需要数据转换,在3.4.8版本下,没有试验成功 在3.4.8版本下,先转换类型,再进行除法操作,也没试验成功。 这个可以:文章后面有3通道分别归一化: Mat img = cv::imread("bar1.jpg"); img.convertTo(img, CV_32FC1); normalize(img...

 

c++默认是uint8,uchar类型,归一化需要数据转换,在3.4.8版本下,没有试验成功

在3.4.8版本下,先转换类型,再进行除法操作,也没试验成功。

这个可以:文章后面有3通道分别归一化:


  
  1. Mat img = cv::imread("bar1.jpg");
  2. img.convertTo(img, CV_32FC1);
  3. normalize(img, img, 1.0, 0.0, NORM_MINMAX);
  4. cout << img << endl;

后面有vector<double>的成功了,

可能是最后transpose没有做,导致的失败?

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           1,用来规范值,2.规范范围,并且是下限;

beta             只用来规范范围并且是上限;

norm_type   归一化选择的数学公式类型;

dtype           当为负,输出在大小深度通道数都等于输入,当为正,输出只在深度与输如不同,不同的地方游dtype决定;

mark            掩码。选择感兴趣区域,选定后只能对该区域进行操作。

 

4.归一化选择的数学公式类型介绍(norm_type)

设数组中原有{A1,A2,A3...An}

NORM_L1:

 

NORM_INF:

 

NORM_L2:

 

NORM_MINMAX:(AK不属于{max(Ai)},min(Ai),当AK等于max(Ai)时p=1,等于min(Ai)时p=0)

 

6.范围归一化与值归一化的区别

区别一:范围归一化使用的是如下式子,设范围为【0,255】

 

即把src缩放到【0,255】这个范围内,并不使用上面的4个公式去解。

 

区别二:使用范围归一化时,beta必有值不等于0

 

举例说明:

一 值归一化:


  
  1. #include<opencv2/opencv.hpp>
  2. #include<iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. vector<double>a={ 10,11,234,45,65,456,0 };
  7. cv::normalize(a, a, 1,0, cv::NORM_MINMAX);
  8. for (int i=0;i < a.size();i++)
  9. {
  10. cout << a[i] << endl;
  11. }
  12. return 0;
  13. }

 

结果如下:

 

 

二 范围归一化


  
  1. #include<opencv2/opencv.hpp>
  2. #include<iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. vector<double>a={ 10,11,234,45,65,456,0 };
  7. cv::normalize(a, a, 0,255, cv::NORM_MINMAX);
  8. for (int i=0;i < a.size();i++)
  9. {
  10. cout << a[i] << endl;
  11. }
  12. return 0;
  13. }

结果如下:

 

Opencv C++下的Mat归一化
void Mat_L2_mormal(cv::Mat &image)
{
    //mat*mat,
    cv::Mat out;
    out=(image) .mul (image);
    float sum=0.0;
    for (int i=0;i<image.rows;i++){
        sum=sqrt(cv::sum(out.row(i))[0]);
        image.row(i)=(image.row(i)/sum);
    }
    out.release();
}


  
  1. float scale = 0.0078125f ;
  2. float mean_value = 127.5f;
  3. void Mat_L2_mormal(cv::Mat &image)
  4. {
  5. for (int i = 0; i<image.rows; i++)
  6. {
  7. for (int j = 0; j<image.cols; j++)
  8. {
  9. image.at<Vec3b>(i, j)[0] = (image.at<Vec3b>(i, j)[0] - mean_value) * scale;
  10. image.at<Vec3b>(i, j)[1] = (image.at<Vec3b>(i, j)[1] - mean_value) * scale;
  11. image.at<Vec3b>(i, j)[2] = (image.at<Vec3b>(i, j)[2] - mean_value) * scale;
  12. }
  13. }
  14. }
  15. //方法2
  16. double minv = 0.0, max_v = 0.0;
  17. minMaxIdx(image1, &minv, &maxv);
  18. for (int row = 0; row < face_img.rows; row++)
  19. {
  20. for (int col = 0; col < face_img.cols; col++)
  21. {
  22. for (int k = 0; k < 3; k++) {
  23. const auto src = face_img.at<cv::Vec3b>(row, col)[k];
  24. auto dst = 0.0;
  25. if (k == 0) dst = ((float(src) / max_v - 0.485) / 0.229) ;
  26. if (k == 1) dst = ((float(src) / max_v - 0.456) / 0.224) ;
  27. if (k == 2) dst = ((float(src) / max_v - 0.406) / 0.225) ;
  28. inputData[k * resize_w * resize_h + row * resize_w + col] = dst;
  29. }
  30. }
  31. }

二、深度转换–convertTo()
2.1、API介绍

void convertTo( OutputArray dst, int rtype, double alpha=1, double beta=0 )
1
参数dst:输出图像;
参数rtype:要转换的深度;
参数alpha:对灰度值的缩放倍数;
参数beta:对灰度值得增量。
公式: dst = satyrate_cast(src * alpha + beta);

这个也是减均值128,归一化


  
  1. cv::cvtColor(imgResized, imgResized, cv::COLOR_RGB2BGR);
  2. //Mat_L2_mormal(imgResized);
  3. vector<Mat> bgr;
  4. cv::split(imgResized, bgr);
  5. bgr[0].convertTo(bgr[0], CV_32F, 1.f / 128.f, -1.f);
  6. bgr[1].convertTo(bgr[1], CV_32F, 1.f / 128.f, -1.f);
  7. bgr[2].convertTo(bgr[2], CV_32F, 1.f / 128.f, -1.f);

 

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/106175928

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。