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

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

        IplImage* inImg = cvLoadImage("1.bmp", CV_LOAD_IMAGE_GRAYSCALE);
	IplImage* out8u  = cvCreateImage(cvGetSize(inImg), IPL_DEPTH_8U,1);
	IplImage* out8s  = cvCreateImage(cvGetSize(inImg), IPL_DEPTH_8S,1);
	IplImage* out16u = cvCreateImage(cvGetSize(inImg), IPL_DEPTH_16U, 1);
	IplImage* out16s = cvCreateImage(cvGetSize(inImg), IPL_DEPTH_16S, 1);
	IplImage* out32s = cvCreateImage(cvGetSize(inImg), IPL_DEPTH_32S, 1);
	IplImage* out32f = cvCreateImage(cvGetSize(inImg), IPL_DEPTH_32F, 1);
	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深度上来保存。这时候要用到一个函数。

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

该函数可以完成图像数据的尺度变换、平移和数据格式变换。
可以利用此函数完成图像数据尺度变换以便于其显示和保存。方法如下:
	//显示,需将其转换到0~1之间
	double m, n;
	cvMinMaxLoc(out32f, &m, &n, NULL, NULL, NULL);
	cvConvertScale(out32f, out32f, 1.0/(n-m), 1.0*(-m)/(n-m));
	cvShowImage("out",out32f);

	//保存,需转化为8位图像
	cvMinMaxLoc(out32f, &m, &n, NULL, NULL, NULL);
	cvConvertScale(out32f, out8u, 255.0/(n-m), 255.0*(-m)/(n-m));
	cvSaveImage("out.png", out8u);
	cvWaitKey(-1);

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





  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值