在處理一些需要圖像相加運算的操作時,通常定義
IplImage* dst = cvCreateImage(cvGetSize(img),IPL_DEPTH_64F,img->nChannels);
當處理完成後,需要對原這個IPL_DEPTH_64F深度的圖像進行顯示的時候,就需要做一些轉換。可以用cvScale()這個函數,這個函數主要是對圖像做線性變換。如果不轉換的話,可以發現顯示的圖像是全白的。這是由於IPL_DEPTH_64F類型的圖片顯示範圍爲[0,1]。
cvMinMaxLoc(dst, &m, &M, NULL, NULL, NULL);
cvScale(dst, dst, 1.0/(M-m), 1.0*(-m)/(M-m));//圖像數據轉換到[0,1]區間
這個時候就可以正常的顯示圖像了。當需要在不同深度的圖像之間轉換時,也可以用cvScale()這個函數。這個時候的轉換,中間有個截斷處理過程。比如IPL_DEPTH_64F到IPL_DEPTH_8U,就會把300轉換到255。下面轉一段別人總結的深度顯示範圍。
測試double型:0.0--1.0之間 IPL_DEPTH_64F
測試float型:0.0--1.0之間 IPL_DEPTH_32F
測試long型:0--65535之間 IPL_DEPTH_32S
測試short int型:-32768--32767之間 IPL_DEPTH_16S
測試unsigned short int型:0--65535之間 IPL_DEPTH_16U
測試char型:-128--127之間 IPL_DEPTH_8S
測試unsigned char型:0--255之間 IPL_DEPTH_8U
這個時候如果需要保存圖像,請記住要先轉換到IPL_DEPTH_8U的深度。因爲只有8位單通道或者3通道(通道順序爲'BGR' )纔可以使用cvSaveImage保存。下面貼一段自己測試用的代碼: