2016-03-04 61 views
2

我有一個數據類型爲double的矩陣finalMat,其值在0到255之間。它實際上對應於某個圖像。我在顯示它如下:將矩陣保存爲圖像

imshow(finalMat, []); 

但是當我嘗試使用下面的代碼保存,保存的圖像完全是白色。

imwrite(finalMat,'myImage.jpeg','JPEG'); 

我想將圖像保存在磁盤上而不更改finalMat矩陣中的值。當我讀取保存的圖像,即myImage.jpeg時,我必須獲得與finalMat中相同的值。有人可以幫助保存圖像嗎?

回答

1

imwrite首先在寫入文件之前檢查數據類型,以確定如何處理輸入中的值。如果輸入是double,則假定範圍是0到1.如果輸入是uint8,則它假定[0,255]。

您的兩個選項是將數據轉換爲uint8或在0和1之間進行歸一化,並將其保留爲double

投作爲一個uint8

爲了您具體例如,你已經有0和255之間的大概數據不希望這樣的比例數據,所以你可能會想要去的uint8投路線。

imwrite(uint8(finalMat), 'file.jpg'); 

請記住,因爲你有一個double圖像矩陣,這將迫使所有的數字是整數值,所以當你加載它放回MATLAB它可能不準確等於

規範化圖像數據

更廣泛地說,你通常會想要去使用mat2gray爲你做的正常化,它允許您利用完整的8位範圍內的標準化方法。

imwrite(mat2gray(finalMat), 'file.jpg') 

注意:你提到你希望得到的圖像是正好等於你傳遞到它的基質。不幸的是,你的輸入數據是double,它需要每像素64位。 由MATLAB支持的成像格式實際上可以存儲全部 64位,所以無論你如何做到這一點,你最終都會遇到一些不同。如果要將這種影響降至最低,請查找支持16位或32位數據的圖像格式(您當前創建的JPEG爲8位)。此外,我會建議使用JPEG,因爲這可能是一種有損壓縮類型。如果您想要無損壓縮,請使用TIFF或PNG。

+0

我絕對不會使用'uin8',因爲它只是一個類型轉換。可能更好'mat2gray' –

+0

@AnderBiguri無論如何,即使是雙重進入,「imwrite」只是將它寫成'uint8'嗎?該文檔說它被轉換爲8位圖像:「如果A是數據類型爲double或single的灰度或RGB彩色圖像,則imwrite假定動態範圍爲[0,1],並自動按比例縮放數據255,然後將它作爲8位值寫入文件,如果A中的數據是單個數據,則在寫入GIF或TIFF文件之前將A轉換爲2。 – Suever

+0

是的,但是當你使用'uint8()'圖像時,它只是施加這些值。 'mat2gray'是一樣的東西,但確保它也被縮放。不加限制地使用'uint8'將導致未知的結果。 –

0

您是否閱讀過幫助? http://www.mathworks.com/help/matlab/ref/imwrite.html

如果A是數據類型雙鏈或單的灰度或RGB彩色圖像,然後 imwrite假定動態範圍爲[0,1],並自動 其寫入之前由縮放255的數據該文件爲8位值。 如果A中的數據是單個數據,則在寫入 GIF或TIFF文件之前,將A轉換爲double。