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_8U unsigned char 1 0~255 0~255
IPL_DEPTH_8S char 1 -128~127 -128~128
IPL_DEPTH_16U unsigned short 2 0~65535 0~65535
IPL_DEPTH_16S short 2 -32768~32767 -32768~32767
IPL_DEPTH_32S long 4 long 0~65535
IPL_DEPTH_32F float 4 单精度 0~1
IPL_DEPTH_64F double 8 双精度 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位。

转载:https://blog.csdn.net/zhangSMILE123456/article/details/47313751

猜你喜欢

转载自blog.csdn.net/xiachong27/article/details/82084203