Ubuntu系统VScode实现opencv(c++)图像像素类型转换和归一化

在OpenCV中,像素归一化(Normalization) 是将图像的像素值映射到特定范围或分布的过程,目的是消除数据量纲差异、增强特征一致性,并提升算法的鲁棒性。

在机器学习(如神经网络)中,归一化后的数据梯度更稳定,显著加快训练收敛速度。

opencv有四种归一化的方式:

1. 最小-最大归一化(Min-Max Normalization)

最小-最大归一化(Min-Max Normalization)是一种线性缩放方法,把0-255区间的像素数值映射到 [0, 1],使不同量纲、不同尺度的特征处于同一数量级,避免算法被大数值主导。

其中,a,b是目标区间(默认为 0 到 1);

2. L2范数归一化

L2 范数归一化(L2 Normalization)把向量所有元素的平方和开根号后作为分母,使向量的 L2 范数(欧几里得长度)等于 1

3. L1 范数归一化(Manhattan 归一化)

L1 范数归一化(又称 Manhattan 归一化)通过把向量所有元素的绝对值之和作为分母,使向量的 L1 范数(曼哈顿长度)等于 1,从而将数据压缩到单纯形(simplex)上。

4. 均值标准化(Z-score 归一化)

均值标准化(Z-score Normalization)把原始数据 线性变换为均值 0、标准差 1 的分布,使数值无量纲、均值为零、方差统一,便于不同特征可比与梯度下降收敛。

类型转换

函数:convertTo()

复制代码
void cv::Mat::convertTo(
    OutputArray dst,            // 输出矩阵
    int rtype,                  // 目标类型,如 CV_8U、CV_32F 等
    double alpha = 1,           // 缩放因子
    double beta  = 0            // 偏移量
) const;

 Mat image_float;
 image.convertTo(image_float,CV_32F);//CV_8UC3->CV_32FC3

上述代码实现了图像像素类型的转换,由CV_8UC3转换到CV_32FC3;

归一化

函数:normalize()

复制代码
void normalize(InputArray src,
               OutputArray dst,
               double alpha = 1,   // 下界或范数目标值
               double beta  = 0,   // 上界(仅 Min-Max 用到)
               int norm_type = NORM_L2,  // 归一化类型
               int dtype = -1,            // 输出深度;<0 与 src 相同
               InputArray mask = noArray() // 掩膜,可选
);

alpha,beta是区间,一般归一化取(0,1),norm_type则是选择归一化的方式;

下面是使用方法:

当将图片转换到float,直接显示是不行的,我们需要将其归一化才能正常显示;

复制代码
void Demo::Norm_Demo(Mat &image)
{
    Mat image_float,norm_image;
    image.convertTo(image_float,CV_32F);//CV_8UC3->CV_32FC3
    cout<<image.type()<<image_float.type()<<endl;
    normalize(image_float,norm_image,1,0,NORM_MINMAX);
    imshow("norm",norm_image);
}
相关推荐
谱写秋天2 分钟前
VSCode+Qt+CMake详细地讲解
c++·ide·vscode·qt·编辑器
A7bert77743 分钟前
【YOLOv5部署至RK3588】模型训练→转换RKNN→开发板部署
c++·人工智能·python·深度学习·yolo·目标检测·机器学习
oioihoii1 小时前
现代C++工具链实战:CMake + Conan + vcpkg依赖管理
开发语言·c++
黑客影儿1 小时前
使用UE5开发2.5D开放世界战略养成类游戏的硬件配置指南
开发语言·c++·人工智能·游戏·智能手机·ue5·游戏引擎
九离十2 小时前
STL——vector的使用(快速入门详细)
开发语言·c++·stl
君鼎2 小时前
More Effective C++ 条款08:理解各种不同意义的new和delete
c++
十五年专注C++开发3 小时前
通信中间件 Fast DDS(二) :详细介绍
linux·c++·windows·中间件·fastdds
ajassi20003 小时前
开源 C++ QT Widget 开发(六)通讯--TCP调试
c++·qt·开源
枫の准大一4 小时前
【C++游记】List的使用和模拟实现
开发语言·c++·list
qq_433554544 小时前
C++深度优先搜素
开发语言·c++·深度优先