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

OpenCV 专栏收录该内容
5 篇文章 0 订阅

参考网址:

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()。



  • 1
    点赞
  • 1
    评论
  • 8
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值