2010-04-12 380 views

回答

22

要轉換grayscale imageRGB image,有兩個問題必須解決:

  • Grayscale images是2-d,而RGB images是3-d,所以你要複製的灰度圖像數據的三個次並沿着第三維連接三個副本。
  • 圖像數據可以存儲在許多不同的data types,所以你必須相應地轉換它們。當作爲double數據類型存儲時,圖像像素值應該是0到1範圍內的浮點數。存儲爲uint8數據類型時,圖像像素值應該是0到255範圍內的整數。您可以使用功能class檢查圖像矩陣的數據類型。

這裏有3個典型的狀況下,你可能會遇到:

  • 要將uint8double灰度圖像轉換成的RGB圖像相同的數據類型,您可以使用的功能repmatcat

    rgbImage = repmat(grayImage,[1 1 3]); 
    rgbImage = cat(3,grayImage,grayImage,grayImage); 
    
  • 要轉換uint8 gra到double RGB圖像yscale圖像,你應該轉換爲double第一,然後規模由255:

    rgbImage = repmat(double(grayImage)./255,[1 1 3]); 
    
  • 要在double灰度圖像轉換爲uint8 RGB圖像,你應該通過255第一標尺,然後轉換成uint8

    rgbImage = repmat(uint8(255.*grayImage),[1 1 3]); 
    
+0

我剛做了一個測試,看起來'double(grayImage)'和'grayImage'是一樣的嗎?在MATLAB中用'./'和'。*'來劃分和乘積運算符?似乎'。/'和'/'是一樣的嗎? – user198729 2010-04-12 13:11:02

+0

@ user198729:運算符'./'和'。*'表示*元素*分割和乘法,以便圖像矩陣的每個元素除以或乘以255.您可以檢查類(即數據類型)通過輸入'class(grayImage)'來輸入矩陣。雖然'double(grayImage)'和'grayImage'可能會出現*相同,它們可能每個都是不同的類(使得它們以不同的方式存儲它們的值)。 – gnovice 2010-04-12 13:17:28

+0

我嘗試了各種操作,但是'/'和'。/'從不給出不同的結果...並且因爲double(grayImage)與'grayImage'相同,所以double(grayImage)./ 255'也是和'grayImage./255'一樣。所以,你可以舉兩個例子來說明爲什麼'./'和'double'是必須的? – user198729 2010-04-12 13:25:13

2

根據定義,RGB圖像有3個通道,這意味着您需要一個三維矩陣來表示圖像。所以,正確的答案是:

rgbImage = repmat(255*grayImage/max(grayImage(:)),[1 1 3]); 

正常化時要小心grayImage。如果grayImageuint8那麼您將在255*grayImage/max(grayImage(:))操作中失去一些精度。

此外,標準化grayImage取決於數據。在你的問題,你用兩種方法:

rgbImage = grayImage/max(max(grayImage)); 

其標準化的灰度圖像,使得圖像中的最大值爲1

rgbImage = grayImage/255; 

它纔有意義,如果在grayImage謊言中的值0-255系列。

所以它真的取決於你想要做什麼。但是,如果您需要RGB圖像,則需要將單通道矩陣轉換爲3通道矩陣。

+0

我認爲,通過定義'rgbImage'的最大值爲'1',表示'white',但這似乎不是如此呢? – user198729 2010-04-12 08:42:31

+0

不是,它取決於您對圖像的使用情況。 – Jacob 2010-04-12 14:10:46