im2double在matlab,在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位)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值