在OpenCV中实现matlab中的im2double功能

最近在把matlab的代码转化到VS2010上。

matlab中采用im2double将读入的图像转换为double型,在OpenCV中就需要对图像进行深度的转换。

读入一幅灰度图像,深度为1(8U),在与其他矩阵M做运算事要保证深度是一致的,所以需要转换,如转换到深度为8(64F),需要用到OpenCV中的函数cvConvert。

 

代码如下:
IplImage* src = cvLoadImage("./Image/2/多波段.bmp",CV_LOAD_IMAGE_GRAYSCALE);   //载入灰度图像,深度为8U

IplImage* dst= cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_64F, 1);

cvConvert(src, dst);    //dst的数据部分在数值上与src的值一致,而其深度转换成了64F。

                                //其实我是用的这个: cvConvertScale(src, dst, 1.0/255, 0);

 

cvConvert函数用于图像和矩阵之间的相互转换

 为什么要用cvConvert 把IplImage转为矩阵?

      因为IplImage里的数据,只能用uchar的形式存放,当需要把这些图像数据看作数据矩阵来运算时,0~255的精度显然满足不了要求;

 然而CvMat里却可以存放任意通道数、任意格式的数据,这个机制方便了研究中的这种需求,转化为矩阵就可以进行更自由的计算。

 

 

opencv的IplImage结构中有一个成员:depth。
其取值如下:
枚举值

用%d输出 二进制

IPL_DEPTH_8U : 8 : 0x0000 0008
IPL_DEPTH_8S :

-2147483640 : 0xffff fff8

IPL_DEPTH_16U : 16 : 0x0000 0010
IPL_DEPTH_16S : -2147483632 : 0xffff fff0
IPL_DEPTH_32S : -2147483616 : 0xffff ffe0
IPL_DEPTH_32F : 32 : 0x0000 0020
IPL_DEPTH_64F : 64 : 0x0000 0040

从文件或摄像头直接读取的图像一般都是8U的
当有特殊计算需求时可以用cvScale() 或cvCvtScale() 转换。

保存时必须转换回8U!

不同的深度其取值范围不一样:
0.0--1.0之间

IPL_DEPTH_64F

0.0--1.0之间

IPL_DEPTH_32F

0--65535之间

IPL_DEPTH_32S

-32768--32767之间

IPL_DEPTH_16S

0--65535之间

IPL_DEPTH_16U

-128--127之间

IPL_DEPTH_8S

0--255之间

IPL_DEPTH_8U

 

在用cvCreateMat函数时,参数:

CV_8UC1 for Unsigned 8bits

CV_32FC1 for float(32位)

CV_64FC1 for double(64位) 

 

 

posted @ 2013-08-21 20:54  紫清婷  阅读(3172)  评论(0编辑  收藏  举报