2014-10-27 117 views
4

我是OpenCV的新手。我的程序以16位無符號整數讀取圖像數據。我需要乘以一些16位無符號整數的圖像數據。所以,結果數據應該保存在32位圖像文件中。 我試過,但是我得到了8位全白的圖像。請幫忙。如何在OpenCV中將16位圖像轉換爲32位圖像?

Mat inputData = Mat(Size(width, height), CV_16U, inputdata); 
    inputData.convertTo(input1Data, CV_32F); 
    input1Data = input1Data * gain;//gain is ushort 
+0

你如何顯示圖像? 'imshow'假定float/double值在0(黑色)和1(白色)之間,因此可能只需將值設置在該範圍內即可。 'cv :: imshow(「test」,input1Data/65000.0f)'或除以另一個更符合你的值的值;) – Micka 2014-10-27 16:18:05

+0

@Micka,謝謝你的回答。你能否檢查我添加的附加信息。我非常感謝你的幫助。 – Main 2014-10-27 21:32:34

回答

4

由於Micka注意到了評論,首先我們需要擴展inputData有0.0F之間的值,並通過將縮放因子1.0F:

inputData.convertTo(input1Data, CV_32F, 1.0/65535.0f); // since in inputData 
                 // we have values between 0 and 
                 // 65535 so all resulted values 
                 // will be between 0.0f and 1.0f 

而現在,同樣與乘法:

input1Data = input1Data * gain * (1.0f/65535.0f); // gain, of course, will be 
                // automatically cast to float 
                // therefore the resulted factor 
                // will have value from 0 to 1, 
                // so input1Data too! 

我認爲這應該編譯過:

input1Data *= gain * (1.0f/65535.0f); 

通過不創建臨時數據優化第一個版本。

+0

感謝您的回答。我對原始代碼進行了更改。如果CV_32F被CV_32S替換,那麼input1Data是否仍然保存了最終的32位數據?因爲,我不是在尋找浮點圖像。我需要32位無符號圖像(因爲增益和輸入數據是ushort,16位無符號),但根據我的研究,不可能獲得32位無符號圖像。這讓我很困擾。在增益乘法之後,我仍然需要將32位圖像恢復爲16位無符號圖像(ushort)。請幫忙。再次感謝你的幫助。 – Main 2014-10-27 21:11:22

+1

你可以用32位浮點格式計算所有的東西,最後在保存/顯示前轉換回16位int,如果速度性能不重要的話。 – Micka 2014-10-28 06:10:04