scikit-image:使用imsave将ndarray写入图像,使用imread读回,数据不匹配

时间:2017-11-18 02:49:16

标签: python scikit-image

这是最低工作示例:

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]]]

有人可以给我一些建议吗?

2 个答案:

答案 0 :(得分:5)

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]]]

答案 1 :(得分: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)