Qt+OpenCV联合开发(二十)--图像像素类型转换与归一化

一、基本知识

在前面学习的基础上,大家知道了一张图像默认的存储格式是8位字节类型的,实际上在opencv中可以转换不同的数据类型(如转成浮点型),用convertTo()的API函数实现。

另外,还可以把数据的取值范围0-255压缩到0-1的取值范围,这就是归一化,通俗地讲就是将矩阵的值通过某种方式变到某一个区间内。用归一化函数normalize()实现。当图像的像素处于0-1范围时,由于仍然介于0-255之间,所以图像依旧是有效的,并且可以正常查看图像,图像的像素归一化是一个图像的预处理过程。

归一化的好处:如果我们在将图像输入到神经网络之前对图像做像素值归一化的处理,即将像素值缩放到0-1之间,非常便于处理。

四种归一化的方法:

  • NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,常用
  • NORM_INF: 根据OpenCV的对应项,可能是归一化数组的C-范数(绝对值的最大值)
  • NORM_L1 :  归一化数组的L1-范数(绝对值的和)
  • NORM_L2: 归一化数组的L2-范数(欧几里德)

二、函数原型

1、convertTo函数

作用:将数组(图像)转换为另一种具有可选缩放比例的数据类型

c++原型:

 参数:

  1. m——输出矩阵(图像),如果在操作之前它没有合适的大小或类型,它会被重新分配
  2. rtype——所需的输出矩阵类型,或者更明确的,是输出矩阵的深度;如果rtype 为负(常用-1),则输出矩阵将与输入具有相同的类型
  3. alpha——可选比例因子
  4. beta——添加到缩放值的可选增量

m(i)=src(i) x alpha+(beta,beta,...)

注:

  • alpha和beta是缩放参数,也可以写为scale和shift
  • 如果alpha=1,beta=0,则不进行比例缩放。
  • 如果输入数组与输出数组的类型相同,则函数可以被用于缩放和平移矩阵或图像。
  • 不是所有格式的Mat型数据都能被使用保存为图片,目前OpenCV主要只支持单通道和3通道的图像,并且此时要求其深度为8bit和16bit无符号(即CV_16U),所以其他一些数据类型是不支持的,比如说float型等。如果Mat类型数据的深度和通道数不满足上面的要求,则需要使用convertTo()函数和cvtColor()函数来进行转换。

2、normalize函数

作用:归一化数据。该函数分为范围归一化与数据值归一化。

c++原型:

 参数:

  1. src               输入图像
  2. dst               输出图像,图像的大小和输入的图像一致
  3. alpha           1.用来规范值,2.规范范围,并且是下限
  4. beta             只用来规范范围并且是上限;为0时则为值归一化,否则为范围归一化
  5. norm_type   归一化选择的数学公式类型,有NORM_INF, NORM_MINMAX,NORM_L1和NORM_L2四种
  6. dtype           为负,输出的大小深度通道数都等于输入;为正,输出只有深度与输如不同,不同的地方由dtype决定,默认类型与src一致
  7. mark            操作掩膜。选择感兴趣区域,选定后只能对该区域进行操作,默认为空

norm_type参数补充:

  • 在 NORM_MINMAX 模式下,alpha表示归一化后的最小值,beta表示归一化后的最大值。
  • 在NORM_L1、NORM_L2、NORM_INF 模式下,alpha表示执行相应归一化后矩阵的范数值,beta不使用。
  • 稀疏矩阵归一化仅支持非零像素

三、实现效果(NORM_MINMAX)

 1、调用convertTo函数转换数据类型后,此时还未进行归一化的结果如图,打印结果为16和21,16代表CV_8UC3通道的彩色图像,21代表CV_32FC3,本来是RGB三通道的取值范围为0-255,每个通道是8位,现在是RGB三通道的,每个通道32位浮点数

Qt+OpenCV联合开发(二十)--图像像素类型转换与归一化_第1张图片

Qt+OpenCV联合开发(二十)--图像像素类型转换与归一化_第2张图片

2、 转换数据类型后再进行归一化后的结果

Qt+OpenCV联合开发(二十)--图像像素类型转换与归一化_第3张图片

 Qt+OpenCV联合开发(二十)--图像像素类型转换与归一化_第4张图片

 3、如果没有转换数据类型直接就进行归一化,不显示图像,打印三个16(因为都是字节类型)做出来是浮点数,但是存储不了,浮点数0-1直接只能存0或1,然后取值范围0-1,进行归一化后不是0就是1,就变成了字节类型,所以就变成16

Qt+OpenCV联合开发(二十)--图像像素类型转换与归一化_第5张图片

 4、转换数据后不进行归一化的结果

Qt+OpenCV联合开发(二十)--图像像素类型转换与归一化_第6张图片

 这就是为什么变成浮点数之后没法显示,因为浮点数的取值范围必须归一化到0-1之间

四、代码

void test1::normalize_demo(Mat &image)
{
    Mat dst;
    cout<

附归一化的计算原理

Qt+OpenCV联合开发(二十)--图像像素类型转换与归一化_第7张图片

 原创不易,转载请注明出处:

https://blog.csdn.net/hml111666/article/details/122785148

图像归一化还可以参考以下链接:

OpenCV之图像归一化(normalize) - 葫芦娃508 - 博客园

你可能感兴趣的:(C/C++,opencv,Qt实战,qt,opencv,计算机视觉)