2016-09-07 87 views
0

我是Matlab新手,所以這應該是一個簡單的問題。我有一個具有幾個特定像素的圖像,我需要從中獲取紅色RGB分量,對它們進行求和,然後將結果存儲到變量中。默認情況下,這些值的類型是uint8,所以總和不能超過255.我嘗試過使用double()的每個組合來將R值轉換爲double,但似乎沒有任何工作。這正是發生了什麼,從終端複製:(所有像素的R值在200以上)Matlab將像素值轉換爲雙精度

img = imread('img.png'); 
r = img(64,64,1) 
r = 
    224 
r = r + double(img(64,65,1)) 
r = 
    255 
r = r + double(img(64,66,1)) 
r = 
    255 

我在做什麼錯?我無法將這些值轉換爲雙倍嗎?

+1

'r = double(img(64,64,1))''? – beaker

+0

在這個特定的情況下,它可能會更容易做'sum(img(64,64:66,1))' – beaker

+0

我注意到你沒有接受任何問題的答案。請閱讀http://stackoverflow.com/help/someone-answers – beaker

回答

1

對於圖像處理,大部分時間是用im2double功能,因此0-1之間讀入一個雙陣列的圖像轉換是一個好主意:

img = im2double(imread('img.png')); 

那麼你不在同一個程序中需要擔心數據類型。

double()數據類型轉換獨自幾乎不這麼做,你打算什麼圖像,因爲UINT8和雙圖像數據類型和數據範圍不同。

0

發生了什麼事在該行r = r + double(img(64,65,1))是,img(64,65,1)值轉換爲double,但隨後立即被轉換回class(r)因爲r是一個整數級,並且在操作的優先級。觀察class(int64(10)+10)給出int64。正如燒杯所評論的,這裏的關鍵是首先將r本身轉換爲double

您可能不必擔心使用double()來進行轉換;雙精度可以表示高達2^53-1的整數,這比255大得多。因此,如果您只是進行簡單的像素求和操作或類似的操作,那麼在計算中不會失去任何精度。當然,如果你需要把它放回到圖像中,那麼大約255的任何東西都會飽和。所以,根據你所做的將事物重新縮放到0到1之間,這可能更有意義;在這種情況下,正如明鏡建議的那樣,最好使用im2double