我在 Python 中使用 imageio 庫處理影像,得到了意想不到的結果。
我用下面的代碼測驗了這個問題:
import imageio
import numpy as np
imgarray = np.zeros((3, 4032, 3024), dtype=np.uint8)
imgarray[0, 0::2, 1::2] = 255
print('Original\n', imgarray)
imageio.imsave('test.jpg', imgarray.transpose(1, 2, 0))
img = imageio.imread('test.jpg')
imgarray = np.array(img).transpose(2, 0, 1)
print('\n\nSave and load\n', imgarray)
列印結果為:
Original
[[[ 0 255 0 ... 255 0 255]
[ 0 0 0 ... 0 0 0]
[ 0 255 0 ... 255 0 255]
...
[ 0 0 0 ... 0 0 0]
[ 0 255 0 ... 255 0 255]
[ 0 0 0 ... 0 0 0]]
[[ 0 0 0 ... 0 0 0]
[ 0 0 0 ... 0 0 0]
[ 0 0 0 ... 0 0 0]
...
[ 0 0 0 ... 0 0 0]
[ 0 0 0 ... 0 0 0]
[ 0 0 0 ... 0 0 0]]
[[ 0 0 0 ... 0 0 0]
[ 0 0 0 ... 0 0 0]
[ 0 0 0 ... 0 0 0]
...
[ 0 0 0 ... 0 0 0]
[ 0 0 0 ... 0 0 0]
[ 0 0 0 ... 0 0 0]]]
Save and load
[[[ 50 112 48 ... 120 56 118]
[ 45 46 45 ... 45 45 46]
[ 45 116 55 ... 112 52 129]
...
[ 53 45 45 ... 50 45 45]
[ 48 114 49 ... 117 53 119]
[ 45 47 46 ... 45 45 46]]
[[ 0 48 0 ... 56 0 54]
[ 0 0 0 ... 0 0 0]
[ 0 52 0 ... 48 0 65]
...
[ 0 0 0 ... 0 0 0]
[ 0 50 0 ... 53 0 55]
[ 0 0 0 ... 0 0 0]]
[[ 0 48 0 ... 56 0 54]
[ 0 0 0 ... 0 0 0]
[ 0 52 0 ... 48 0 65]
...
[ 0 0 0 ... 0 0 0]
[ 0 50 0 ... 53 0 55]
[ 0 0 0 ... 0 0 0]]]
為什么原來的numpy陣列和保存加載后的numpy陣列不一樣?
我認為它們在保存和加載后應該是相同的。
我在使用不同的庫時遇到同樣的問題,例如 cv2 或 PIL.Image。
有沒有辦法在保存和加載后保持資料不變?
uj5u.com熱心網友回復:
JPEG是一種使用有損壓縮的影像格式。該演算法旨在通過洗掉人眼通常無法感知的細節來減小檔案大小。如果您需要保留準確的像素資訊,請使用無損壓縮的影像格式,例如PNG。
為了使您的代碼按預期作業,您只需要更改檔案結尾:test.png而不是test.jpg. ImageIO 負責其余的作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/316993.html
