18 图像像素类型转换与归一化
opencv知识点:
- 数据类型 - CV_bit位数+U/S/F+C通道数
- 数据类型转换 - convertTo
- 归一化类型 - NormTypes
- 归一化 - normalize
本课所解决的问题:
- 如何转换图像数据类型?
- 如何归一化图像像素取值?
- 归一化有什么用?
1.图像像素类型
在opencv当中,我们可以通过API,对图像数据类型进行转换,以及对数据的取值空间范围进行转换。
它们分别要用到的API:
- convertTo
- normalize
这里分别对它们进行解释
convertTo
convertTO
数据类型转换
本文采用了第一种传参方式
共2个参数
第1个参数 输入
第2个参数 将要转换的数据类型(查阅文档可知)
normalize
normalize
归一化
本文采用了第一种传参方式
共7个参数
第1个参数 输入
第2个参数 输出
第3个参数 归一化范围下限
第4个参数 归一化范围上限
第5个参数 归一化类型(查阅文档可知)
第6个参数 默认类型与src一直
负数,则类型与src一直
否则,通道数和src一致,depth=指定的图像深度(图像深度= 图像列数*通道数)
第7个参数 可选mask
关于归一化类型,常用的有4种:
- NORM_L1——求和归一
- NORM_L2——三维向量转单位向量归一
- NORM_INF——根据最大值归一
- NORM_MINMAX——根绝最大最小值差值归一(最为常用)
官方文档解释如下
2.图像像素类型转换
一般彩色图像的数据类型是CV_8UC3,它代表什么含义呢?下面进行解释
数据类型公式:
CV_bit位数+U/S/F+C通道数。当单通道时,C1可以省略
U/S/F解释:
- S——signed int——有符号整形
- U——unsigned int——无符号整形
- F——float——单精度浮点型
如CV_8UC3
- 8指8it
- U指无符号整型
- C指通道数
接下来进行数据类型转换
//函数定义
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]
3.图像像素归一化
oid 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);
/*
要注意的是,数据类型是不变的
如果U没有转成浮点型的数据类型,那么归一化后的取值只有0/1两种,没有意义
*/
std::cout << dst.type() << std::endl;
}
转换后的
没有转换的
4.归一化——延伸知识
计算机视觉-深度学习相关:
归一化 (Normalization)、标准化 (Standardization)和中心化/零均值化 (Zero-centered)
本课所用API查阅
1.数据类型——原始类型
2.数据类型——typedef
3.数据类型——#define
4.NormTypes——归一化类型
5.convertTo
6.normalize
7.imshow