2017-11-18 123 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

我昨天试过,问题依然存在。保存和回读后,数据发生变化。 –