2017-11-18 124 views
2

這裏是最低工作例如:scikit圖像:寫一個ndarray與imsave圖像,讀回imread,數據不匹配

import numpy as np 
from skimage.io import imsave, imread 

image = np.array([[[109, 232, 173], 
       [ 55, 35, 144]], 
       [[ 43, 124, 185], 
       [234, 127, 246]]], dtype=np.uint8) 

imsave("test.jpg", image) 
rb_image = imread("test.jpg") 
print("original image") 
print(image) 
print("read back image") 
print(rb_image) 

運行後,其結果是,在ndarray閱讀從文件返回不匹配

original image 
[[[109 232 173] 
    [ 55 35 144]] 

[[ 43 124 185] 
    [234 127 246]]] 
read back image 
[[[111 208 255] 
    [ 42 61 138]] 

[[ 72 140 201] 
    [141 131 218]]] 

有人可以給我一些建議嗎?

回答

3

JPEG是一種有損圖像壓縮算法,旨在通過減少文件大小擺脫的信息,是不是容易從人眼看到。這意味着以JPG格式保存會節省一些磁盤空間,但會改變陣列的像素值。

您可以通過保存無損png格式來避免此問題。下面的代碼片段對我的作品

import numpy as np 
from skimage.io import imsave, imread 

image = np.array([[[109, 232, 173], 
       [ 55, 35, 144]], 
       [[ 43, 124, 185], 
       [234, 127, 246]]], dtype=np.uint8) 

imsave("test.png", image) 
rb_image = imread("test.png") 
print("original image") 
print(image) 
print("read back image") 
print(rb_image) 

,這是結果

original image 
[[[109 232 173] 
    [ 55 35 144]] 

[[ 43 124 185] 
    [234 127 246]]] 
read back image 
[[[109 232 173] 
    [ 55 35 144]] 

[[ 43 124 185] 
    [234 127 246]]] 
+0

是的。它也適用於我。我也嘗試保存並讀取兩次jpg。圖像中的數據仍然發生變化。所以在JPG中的數據損失是巨大的。順便說一下,在這種情況下,PNG的文件大小比JPG小很多,這很奇怪,我猜這是因爲數據非常小,試圖壓縮它像JPG一樣,會增加大小而不是降低它的大小算法打算做。 –

+0

@scotthuang當然......數據甚至不是宏塊的大小(也可能是單通道,也許......)。爲什麼不閱讀wiki上的jpeg來理解這一點,如果你有興趣?爲什麼沒有upvote這個答案,因爲它似乎你在這裏獲得了一些東西。 – sascha

+0

我將在稍後嘗試維基,我正在項目中。太多事情正在發生。不想分心。我上傳了你的答案,我等了一天,看看是否有其他人評論你的答案,分享一些想法...... –

0

Scikit使用PIL下,你有沒有嘗試過使用直PIL

在例

import numpy as np 
    from skimage.io import imsave, imread 
    from PIL import Image 

    image = np.array([[[109, 232, 173], 
       [ 55, 35, 144]], 
       [[ 43, 124, 185], 
       [234, 127, 246]]], dtype=np.uint8) 

    Image.fromarray(image).save() 
    rb_image = imread("test.jpg") 
    print("original image") 
    print(image) 
    print("read back image") 
    print(rb_image) 
+0

replalce imsave( 「test.jpg放在」 圖像)Image.fromarray(圖).save( 「test.jpg放在」 )仍然得到相同的結果。 –

+0

我昨天試過,問題依然存在。保存和回讀後,數據發生變化。 –