1. 程式人生 > >opencv影象的深度及取值範圍

opencv影象的深度及取值範圍

影象的位深度及其取值範圍:src.depth()

Mat型別:

矩陣資料型別:

      ——  CV_<bit_depth>(S|U|F)C<number_of_channels>

                S= 符號整型        U=無符號整形         F=浮點型

         如:CV_8UC1   表示一個8位無符號整型單通道矩陣

                CV_32FC2  表示一個32位浮點型雙通道矩陣

還有其他一些格式如下:

CV_8UC1 CV_8SC1 CV_16U C1 CV_16SC1 CV_8UC2 CV_8SC2

 CV_16UC2 CV_16SC2 CV_8UC3 CV_8SC3 CV_16UC3 CV_16SC3 CV_8UC4 CV_8SC4 CV_16UC4 CV_16SC4 CV_32SC1 CV_32FC1 CV_64FC1CV_32SC2 CV_32FC2 CV_64FC2CV_32SC3 CV_32FC3 CV_64FC3CV_32SC4 CV_32FC4 CV_64FC4

depth影象元素的位深度可以是下面的其中之一:

IPLimage型別:

                        位深度                                                    取值範圍

         IPL_DEPTH_8U - 無符號8位整型                         0——255

         IPL_DEPTH_8S - 有符號8位整型                    -127——127

         IPL_DEPTH_16U - 無符號8位整型                       0——65535           

         IPL_DEPTH_16S - 有符號8位整型              -32768——32767 

IPL_DEPTH_32S - 有符號8位整型                       0——65535

         IPL_DEPTH_32F - 無符號8位整型                     0.0——1.0

         IPL_DEPTH_64F - 有符號8位整型                     0.0——1.0

如上,給出影象的位深度及其取值範圍後,我們不難理解,要轉換位深度本質上就是對原深度下的資料做線性變換,使原位深度下的最小值和最大值分別對應轉換後位深度下的最小值和最大值。實現上述線性變換,我們可以用OpenCV庫函式cvConvertScale。

cvConvertScale函式簡介:

cvConvertScale( const CvArr* src, CvArr* dst,double scale CV_DEFAULT(1),double shiftCV_DEFAULT(0) );

功能:使用線性變換轉換陣列

引數說明: src 輸入陣列,dst 輸出陣列,scale 比例因子,shift 偏移量。

對應的線性變換公式:dst(I)=src(I)*scale +(shift,shift,...).

比如將IPL_DEPTH_8U 轉換成 IPL_DEPTH_32U,我們需要用線性變換將[0 255] 對映為 [0 1]。不難求出線性變換的引數scale=1/255, shift=0。

所以:要實現不同位深度間資料的轉換,首先我們需要知道不同位深度對應資料的取值範圍,然後計算出關於兩取值範圍上下限的線性變換,最後將影象資料和線性變換引數代入函式cvConvertScale()。