天天看點

matlab 定義uint8矩陣,記錄Python和Matlab的uint8的差別

python和matlab都可以讀取的圖檔,圖檔的數字類型也可以跟着改變。 比如如果讀了一張hdr的圖檔,圖檔矩陣的數字一定的float的。但是如果把這張圖檔做色調映射(tone mapping)變成ldr圖檔再儲存成.jpg格式的話,圖檔的數字類型必須變到[0,255]的整數。之前我在做灰階圖到彩色圖的轉換的時候發現,同一張圖檔用matlab和python寫成.jpg儲存,結果是不一樣的。如果圖檔名是img的話:

matlab中我用的%matalb

uint8(img)

imwrite(img, '123.jpg')

python用的#python

img.astype('uint8‘)

imageio.imwrite(img, '123.jpg')

這裡matlab儲存的圖像很好,但是python的結果會出問題。如果不用astype的話,寫下的圖檔會發暗。原因是原圖的動态範圍比較大,超過了8bit的範圍。要想存入.jpg格式就必須對動态範圍進行壓縮。為了把涼的變暗,那麼暗的地方自然就更暗了。

如果用astype('uint8')的話,在圖檔一些區域會有集中的大片的單一顔色,好像被油漆刷過一樣。這裡我知道的原因是astype的機制是casting的格式轉換,是以四舍五入會導緻圖檔的顔色改變。具體為什麼出現大片的單一色目前還不清楚。

而matlab的uint8()方程是直接切掉多出去的值。比如說有個2x2矩陣m=[-1,5,3000,200]。uint8(m)之後結果是[0, 5, 255, 200]。也就是說在[0, 255]之間的數字不動,隻把大于255的變成255,把小于0的變成0就好了。

如果在python裡想達到同樣的切除多餘值的效果也很簡單:m[m>255] = 255

m[m<0] = 0

如果圖檔或者矩陣很大的話建議用numpy.clip,速度會快一些。