1.API和相关知识
1.convertTo
convertTO
数据类型转换
本文采用了第一种传参方式
共2个参数
第1个参数 输入
第2个参数 将要转换的数据类型(查阅文档可知)
2.normalize
normalize
归一化,归一指归为同一范围
共7个参数
第1个参数 输入
第2个参数 输出
第3个参数 alpha 规范值/归一化范围下限
第4个参数 beta 归一化范围上限
默认规范值为1,即数值规范为1,此时beta = 0
(所以这两处有两种传参方式
第一种 1.0 0,默认的这种,取值规范为[0,1]
第二种 0,b 下限上限的这种。取值规范为指定范围
两种方式都可以使用)
第5个参数 归一化类型(查阅文档可知)
第6个参数 默认类型与src一直
负数,则类型与src一直
否则,通道数和src一致,depth=指定的图像深度(图像深度= 图像列数*通道数)
第7个参数 可选mask
3.图像数据类型转换
一般彩色图像的数据类型是CV_8UC3,它代表什么含义呢?下面进行解释
数据类型公式:
CV_bit位数+U/S/F+C通道数。当单通道时,C1可以省略U/S/F解释:
S——signed int——有符号整形
U——unsigned int——无符号整形
F——float——单精度浮点型 浮点型图像要显示出来一定要对图像归一化操作
如CV_8UC38指8it
U指无符号整型
C指通道数
2.实例代码
数据类型转换
//函数定义
void norm_demo(Mat& image);
//函数实现
void QuickDemo::norm_demo(Mat& image) {
//数据类型 CV_8UC3 对应16
std::cout << image.type() << std::endl;
image.convertTo(image, CV_32F);//转为32位浮点,通道数没有变
//数据类型 CV_32FC3 对应21
std::cout << image.type() << std::endl;
}
如果我们显示一下转换后的图像,会是什么样?
我们发现,转换为浮点数据类型后,并不能正确显示
这是因为imshow如果想要正确显示浮点类型的图像,必须进行归一化,把取值空间归一化为[0.1]
图像像素值归一化
void QuickDemo::norm_demo(Mat& image) {
//数据类型 CV_8UC3 对应16
std::cout << image.type() << std::endl;
image.convertTo(image, CV_32F);//转为32位浮点,通道数没有变
//数据类型 CV_32FC3 对应21
std::cout << image.type() << std::endl;
Mat dst;
//对像素取值空间进行归一化
normalize(image, dst, 1.0, 0, NORM_MINMAX);
/*
根据我们最先的解释,所以 1.0 0和0 1.0都可以实现归一为取值范围1
要注意的是,数据类型是不变的
如果U没有转成浮点型的数据类型,那么归一化后的取值只有0/1两种,没有意义
*/
std::cout << dst.type() << std::endl;
imshow("norm",dst);
}
进行数据类型转换image.convertTo(image, CV_32F);//转为32位浮点,通道数没有变
转换后的
不进行转换的
归一化延伸知识
本文链接:图像的像素归一化
作者:Pierce_KK图像的像素归一化是一个图像的预处理过程。
当我们做计算机视觉-深度学习的,通常要模型训练。
我们可以直接将原始图像的像素真实值直接作为神经网络模型的训练数据,
但是这可能会给我们模型的训练过程带来一些问题, 因为在深度神经网络训练时一般使用较小的权重值来进行拟合,而当训练数据的值是较大整数值时,可能会减慢模型训练的过程。如果我们在将图像输入到神经网络之前对图像做像素值归一化的处理,即将像素值缩放到0-1之间,就能够避免很多不必要的麻烦。
(虽然图像的像素处于0-1范围时,opencv会自动*255,由于仍然介于0-255之间,所以图像依旧是有效的,并且可以正常查看图像。)