【个人笔记】OpenCV4 C++ 快速入门 18课

个人资料,仅供学习使用
修改时间——2022年2月13日 21:01:34
学习课程:OpenCV4 C++ 快速入门视频30讲
视频老师:贾志刚

18 图像像素类型转换与归一化

opencv知识点:

  • 数据类型转换 - convertTo
  • 数据类型 - CV_bit位数+U/S/F+C通道数
  • 归一化 - normalize
  • 归一化类型 - NormTypes

本课所解决的问题:

  • 如何转换图像数据类型?
  • 如何归一化图像像素取值?
  • 归一化有什么用?

1.图像数据类型与归一化类型

在opencv当中,我们可以通过API,对图像数据类型进行转换,以及对数据的取值空间范围进行转换。

它们分别要用到的API:

  • convertTo
  • normalize

这里分别对它们进行解释

convertTo

convertTO
	数据类型转换
		本文采用了第一种传参方式
		共2个参数
			第1个参数 输入
			第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

关于归一化类型,常用的有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);
	/*
	根据我们最先的解释,所以 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位浮点,通道数没有变

转换后的
在这里插入图片描述

不进行转换的
在这里插入图片描述

4.归一化延伸知识

本文链接:图像的像素归一化
作者:Pierce_KK

图像的像素归一化是一个图像的预处理过程。

当我们做计算机视觉-深度学习的,通常要模型训练。
我们可以直接将原始图像的像素真实值直接作为神经网络模型的训练数据,
但是这可能会给我们模型的训练过程带来一些问题, 因为在深度神经网络训练时一般使用较小的权重值来进行拟合,而当训练数据的值是较大整数值时,可能会减慢模型训练的过程。

如果我们在将图像输入到神经网络之前对图像做像素值归一化的处理,即将像素值缩放到0-1之间,就能够避免很多不必要的麻烦。

(虽然图像的像素处于0-1范围时,opencv会自动*255,由于仍然介于0-255之间,所以图像依旧是有效的,并且可以正常查看图像。)

计算机视觉-深度学习相关:

本课所用API查阅

数据类型——原始类型

在这里插入图片描述

数据类型——typedef

在这里插入图片描述

数据类型——#define

在这里插入图片描述

NormTypes——归一化类型

在这里插入图片描述

normalize

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

convertTo

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

imshow

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啦啦啦大赛第大所

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值