OpenCV笔记——图像不同位深度间的转换

来源:互联网 发布:2016数据有效性的设置 编辑:程序博客网 时间:2024/05/24 22:43

参考网址:

http://baike.baidu.com/view/3440672.htm

http://blog.csdn.net/yihandk666/article/details/7612756


最近编程有用到OpenCV,其中涉及到图像不同位深度间的转换。在网上搜索一番后,总结的东西整理成如下笔记。

图像的位深度及其取值范围

        

     depth 图像元素的位深度,可以是下面的其中之一:

                     位深度                                                            取值范围

      IPL_DEPTH_8U - 无符号8位整型                                     0--255

     IPL_DEPTH_8S - 有符号8位整型                                  -128--127

     IPL_DEPTH_16U - 无符号16位整型                                   0--65535

     IPL_DEPTH_16S - 有符号16位整型                           -32768--32767

     IPL_DEPTH_32S - 有符号32位整型                                    0--65535

     IPL_DEPTH_32F - 单精度浮点数                                     0.0--1.0

     IPL_DEPTH_64F - 双精度浮点数                                      0.0--1.0

位深度转换原理

     如上,给出图像的位深度及其取值范围后,我们不难理解,要转换位深度本质上就是对原深度下的数据做线性变换,使原位深度下的最小值和最大值分别对应转换后位深度下的最小值和最大值。实现上述线性变换,我们可以用opencv库函数cvConvertScale。


cvConvertScale函数简介

    查询百度百科后,可以的得到关于cvConvertScale函数的说明如下。
cvConvertScale( const CvArr* src, CvArr* dst,double scale CV_DEFAULT(1),double shift CV_DEFAULT(0) );

    功能:使用线性变换转换数组

    参数说明:  src  输入数组,dst   输出数组,scale 比例因子,shift 偏移量。

    对应的线性变换公式:   dst(I)=src(I)*scale + (shift,shift,...)。


实例

       比如将IPL_DEPTH_8U 转换成 IPL_DEPTH_32U,我们需要用线性变换将[0 255] 映射为 [0 1]。不难求出线性变换的参数scale=1/255, shift=0。即通过如下代码可实现位深度间转换(注,函数最后一个参数为0,等于默认参数,可以不用写)。

cvConvertScale(pImg8, pImg32, 1.0/255, 0); 
      类似的如果IPL_DEPTH_32U转换成IPL_DEPTH_8U,我们需要用线性变换将[0 255] 映射为 [0 1]。对应的参数为scale=255, shift=0。即可通过如下代码行实现两位深度间的转换。
cvConverScale(pImg32, pImg8, 255, 0);

         其余类型做法相似,不一一举例。

总结

      要实现不同位深度间数据的转换,首先我们需要知道不同位深度对应数据的取值范围,然后计算出关于两取值范围上下限的线性变换,最后将图像数据和线性变换参数代入函数cvConvertScale()。



0 0
原创粉丝点击