基本介绍
ConvertScale
使用线性变换转换数组
void cvConvertScale( const CvArr* src, CvArr* dst, double scale=1, double shift=0 );
#define cvCvtScale cvConvertScale
#define cvScale cvConvertScale
#define cvConvert( src, dst ) cvConvertScale( (src), (dst), 1, 0 )
src
输入数组.
dst
输出数组
scale
比例因子.
shift
该加数被加到输入数组元素按比例缩放后得到的元素上
函数 cvConvertScale 有多个不同的目的因此就有多个同义函数(如上面的#define所示)。该函数首先对输入数组的元素进行比例缩放,然后将shift加到比例缩放后得到的各元素上,即: dst(I)=src(I)*scale + (shift,shift,…),最后可选的类型转换将结果拷贝到输出数组。
多通道的数组对各个通道是独立处理的。
类型转换主要用舍入和溢出截断来完成。也就是如果缩放+转换后的结果值不能用输出数组元素类型值精确表达,就设置成在输出数组数据轴上最接近该数的值。
如果 scale=1, shift=0 就不会进行比例缩放. 这是一个特殊的优化,相当于该函数的同义函数名:cvConvert 。如果原来数组和输出数组的类型相同,这是另一种特殊情形,可以被用于比例缩放和平移矩阵或图像,此时相当于该函数的同义函数名:cvScale。
使用不当,可能会出现下面的错误
请你思考一下几个问题:
1.check这两个图或者矩阵是不是初始化了
2.如果初始化了,初始化的大小是不是一样,即两者有没有相同的长宽
3.两者的depth深度是不是一样,即是不是一个是三通道的,一个是单通道的。
或者一个是单通道32位浮点类型,一个是单通道8位整形类型
例子
opencv 8位图像转32位图像 cvConvertScale
IplImage *im8 = cvLoadImage(argv[1]);
IplImage *im32 = cvCreateImage(cvSize(im8->width, im8->height), 32, 3);
cvConvertScale(im8, im32, 1/255.);
问题问答
问:《学习OpenCV》这本书,里面讲到 ”如果我们有一个 8 位的 RGB 灰度图像并想把它变为 16 位有符号的图像,就可以调用函数 cvConvertScale() 来做这个工作。“
我有连个问题,一个是:既然是RGB图像,为何又是灰度图像?灰度图像不是单通道的吗?但是我把网上的程序应用到RGB彩色图像上,发现也可以操作。
第二个问题是:网上用这个的时候,都将 scale 项设为了 1/255.0 ,我明白这里的意思是将转换后的图像像素值限定在 0 到 255 之间,可是为什么这种转换会导致最后的像素值大于 255 呢?
答:这个函数本质处理只是 矩阵操作,所以用在彩色图片也没问题吧,只要类型设置对了。
scale 项设为了 1/255.0,是想把像素 规约到【0,1】的区间
不是0到255
cvConvertScale函数用于线性变换数组,通过比例因子和加数处理输入数组元素,多通道独立处理。可能出现的错误包括类型不匹配、初始化问题等。常见应用场景包括图像的类型转换,例如8位图像转32位图像。在处理RGB图像时,设置scale为1/255.0是为了将像素值归一化到[0,1]区间。"
122480600,10989150,HUAWEI DevEco Studio云测服务:自动化兼容性测试详解,"['自动化', '华为', '开发语言', '后端', '运维']
1万+





