OpenCV不同图像深度类型的理解

最近利用OpenCV函数库的时候,常常遇到不同深度的图像的转换、显示和保存问题。在网上查阅了很多文章,发现很多说的不够清楚。在此说下自己的理解。


  
  
  1. IplImage* inImg = cvLoadImage( "1.bmp", CV_LOAD_IMAGE_GRAYSCALE);
  2. IplImage* out8u = cvCreateImage( cvGetSize(inImg), IPL_DEPTH_8U, 1);
  3. IplImage* out8s = cvCreateImage( cvGetSize(inImg), IPL_DEPTH_8S, 1);
  4. IplImage* out16u = cvCreateImage( cvGetSize(inImg), IPL_DEPTH_16U, 1);
  5. IplImage* out16s = cvCreateImage( cvGetSize(inImg), IPL_DEPTH_16S, 1);
  6. IplImage* out32s = cvCreateImage( cvGetSize(inImg), IPL_DEPTH_32S, 1);
  7. IplImage* out32f = cvCreateImage( cvGetSize(inImg), IPL_DEPTH_32F, 1);
  8. IplImage* out64f = cvCreateImage( cvGetSize(inImg), IPL_DEPTH_64F, 1);
如上代码涵盖了OpenCV中几种不同深度的数据格式,其特性统计如下:  

图像类型数据类型字节取值范围显示范围
IPL_DEPTH_8Uunsigned char10~2550~255
IPL_DEPTH_8Schar1-128~127-128~128
IPL_DEPTH_16Uunsigned short20~655350~65535
IPL_DEPTH_16Sshort2-32768~32767-32768~32767
IPL_DEPTH_32Slong4long0~65535
IPL_DEPTH_32Ffloat4单精度0~1
IPL_DEPTH_64Fdouble8双精度0~1

上表中,显示范围表示调用OpenCV的cvShowImage能够在屏幕上显示的范围。其中对于IPL_DEPTH_32S、IPL_DEPTH_32F和IPL_DEPTH_64F类型图像来说,

其取值范围与显示范围不一致。

而应用cvSaveImage保存图像的时候,需要把其他深度变换到IPL_DEPTH_8U深度上来保存。这时候要用到一个函数。


  
  
  1. void cvConvertScale(const CvArr* src, CvArr* dst, double scale = 1, double shift = 0)
  2. /*
  3. Parameters:
  4.    src – Source array
  5.    dst – Destination array
  6.    scale – Scale factor
  7.    shift – Value added to the scaled source array elements
  8. *****
  9. The function has several different purposes, and thus has several different names. It copies
  10. one array to another with optional scaling, which is performed first, and/or optional type 
  11. conversion.All the channels of multi-channel arrays are processed independently.
  12. */

该函数可以完成图像数据的尺度变换、平移和数据格式变换。
可以利用此函数完成图像数据尺度变换以便于其显示和保存。方法如下:

   
   
  1. //显示,需将其转换到0~1之间
  2. double m, n;
  3. cvMinMaxLoc(out32f, &m, &n, NULL, NULL, NULL);
  4. cvConvertScale(out32f, out32f, 1.0/(n-m), 1.0*(-m)/(n-m));
  5. cvShowImage( "out",out32f);
  6. //保存,需转化为8位图像
  7. cvMinMaxLoc(out32f, &m, &n, NULL, NULL, NULL);
  8. cvConvertScale(out32f, out8u, 255.0/(n-m), 255.0*(-m)/(n-m));
  9. cvSaveImage( "out.png", out8u);
  10. cvWaitKey( -1);

需要注意的一点是,16位图像可以直接保存为png格式,不需要转化为8位。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值