2012-10-08 73 views
3

我一直在研究一個問題,我需要將矩陣保存爲圖像,並且它是MATLAB中矩陣的真正無損示例。MATLAB tif文件格式vrs PNG文件格式。真正的無損壓縮?

我試圖寫的圖像既無損形式的PNG和TIFF:

 
Name    Size     Bytes Class  Attributes 

    diff   237x354    671184 double    
    imPng   237x354    167796 uint16    
    imPngD   237x354    671184 double    
    imTiff   237x354    83898 uint8    
    imTiffD   237x354    671184 double    
    padded   2042x2170   35449120 double    
    testImage  237x354    671184 double    

testImage是我想無損保存矩陣。

我用以下行矩陣寫爲TIF和PNG:

EDU>> imwrite(testImage,'imTiff.tif','tiff','compression','none'); 
EDU>> imwrite(testImage,'imTiff.png','PNG','bitdepth',16); 

我然後加載的圖像返回到工作空間(imTiff和inPng),並轉換它們的兩倍。

EDU>> imPngD = im2double(imPng); 
EDU>> imTiffD = im2double(imTiff); 

但是當我從testImage中減去imPngD或imTiffD時,剩下剩餘的值。

我的問題是:
我的處理過程中有什麼問題嗎?
如果不是,這是否意味着tif和png並非完全無損?

我可以提供圖片,如果你認爲它會幫助。

我認爲這些圖像可能會有所幫助: testImage
testImage - original
imTiffD和testImage
區別 Difference between imTiffD and testImage
imPngD和testImage
Difference between imPngD and testImage

的區別請注意:灰色像素的值圖像2-3是零,即testImage和重新加載的圖像之間的差異爲零。

+1

他們有什麼不同?難道這只是浮點錯誤的副作用嗎? –

+0

對於PNG,像素值是否適合16位?如果這些值具有分數,則轉換爲16位整數可能會導致精度損失。看看Tiff對象,如果你想寫真正的雙值像素。 –

+0

對不起,我不熟悉浮點錯誤。差異很小,如果我把最大和最小的差異testImage - imTiffD的答案是+ - 0.001960784313725和testImage - imPngD的答案是+ - 7.629510948348184e-06 – Gavin

回答

1

PNG和TIFF都是真正無損的(忽略TIFF選項來打包JPEG,您沒有使用它)。但是,它們的輸入是真正無損的,對於PNG,每個顏色值每個像素8位或16位,或者TIFF每個顏色值每個像素8位。

如果您的眼光超出了8位或16位值的精度,那麼您將看到不同。

+0

所以我會得出結論,在區域圖像2-3以上(剛剛添加)與testImage有區別的地方,當我將矩陣保存爲png或tiff時,不會將testImage的矩陣值的精度進行轉換? – Gavin

+1

您可能在該地區發生溢流。由於源圖像是雙倍的,因此範圍0到1的比例爲0到255.如果數據小於0或大於1,則將環繞,當它返回時,所有值將介於0和1.檢查你的數據。 –