OpenCV 中的 convertTo 函数

文章转载自:
iracer的CSDN博客 http://blog.csdn.net/iracer/article/details/49204147
https://blog.csdn.net/qq_22764813/article/details/52135686

函数

void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;

注意也不是所有格式的Mat型数据都能被使用保存为图片,目前OpenCV主要只支持单通道和3通道的图像,并且此时要求其深度为8bit和16bit无符号(即CV_16U),所以其他一些数据类型是不支持的,比如说float型等。
如果Mat类型数据的深度和通道数不满足上面的要求,则需要使用convertTo()函数和cvtColor()函数来进行转换。
convertTo()函数负责转换数据类型不同的Mat,即可以将类似float型的Mat转换到imwrite()函数能够接受的类型。
而cvtColor()函数是负责转换不同通道的Mat,因为该函数的第4个参数就可以设置目的Mat数据的通道数(只是我们一般没有用到它,一般情况下这个函数是用来进行色彩空间转换的)。
另外也可以不用imwrite()函数来存图片数据,可以直接用通用的XML IO接口函数将数据存在XML或者YXML中。

参数

m       – 目标矩阵。如果m在运算前没有合适的尺寸或类型,将被重新分配。

rtype – 目标矩阵的类型。因为目标矩阵的通道数与源矩阵一样,所以rtype也可以看做是目标矩阵的位深度。如果rtype为负值,目标矩阵和源矩阵将使用同样的类型。

alpha – 尺度变换因子(可选)。

beta   – 附加到尺度变换后的值上的偏移量(可选)。

描述

函数将源矩阵中的像素值转换为目标类型。最后会使用溢出保护函数 saturate_cast<> ,以避免转换过程中可能出现的溢出。函数执行如下运算:


把一个矩阵从一种数据类型转换到另一种数据类型,同时可以带上缩放因子和增量:


由于有数据类型的转换,所以需要用saturate_cast来处理数据的溢出。

示例

在应用分水岭算法分割图像时,标记图像为32位有符号整型CV_32S变量(以便定义超过255个标签,每个值标记一类物体,如255标记目标,128标记背景,0标记未知等等)构成的矩阵markers,想要将标记图像显示出来必须转换其数据类型。
markers.convertTo(tmp,CV_8U,255,255);

将矩阵markers转换为CV_8U类型的矩阵tmp:tmp(x,y)= markers(x,y)*255+255.这样,将图像做线性变换,使值为-1的像素变为0(-1*255+255=0)。值大于255的像素将赋值为255,这是因为CV32S转换为无符号CV_8U时,应用了饱和度运算。具体应用参看分水岭算法的相关博文。


这个比例因子不是放大缩小的因子,实际上范围的意思,比如你原来的图是255的灰度图,你现在转成float型数据,并且归一化到0-1,那么就是scale=1.0/255,如果还是想0-255.0 那么就直接1,就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值