【问题标题】:Scipy imsave and imread change formatScipy imsave 和 imread 更改格式
【发布时间】:2019-01-19 18:32:29
【问题描述】:

当我保存图像时,它的格式是numpy.uint16,当我加载它时,它是numpy.uint8,它给我弄乱了整个管道。如何防止这种情况发生?

我在打电话

from scipy.misc import imread, imsave
image = imread(path)
imread(image_path)

【问题讨论】:

  • 你在写 JPEG 吗?如果是这样,那是不可避免的,因为它本质上是 8 位的。尝试使用 PNG 或 TIFF 或 NetPBM PAM/PPM,所有这些都支持 16 位样本。
  • 我正在使用 tiff 数据,我想保留 16 位格式。以下解决方案是否有任何补充,或者您认为它可以正常工作?
  • 我不确定当您明确需要 16 位 TIFF 时,为什么您会接受写入 8 位 JPEG 的答案...
  • 但是你知道我如何有效地处理 16 位 tiff 吗?
  • 我不明白。这就是我在下面的回答所显示的。

标签: python image-processing scipy image-formats


【解决方案1】:

imsaveimread 方法已弃用,并将在 SciPy 的未来版本中删除。改用imageio.imwriteimageio.imread 应该可以解决这个问题。

>>> import imageio
>>> img = imageio.imread('img.jpg')
>>> img.dtype
dtype('uint8')
>>> imageio.imwrite('img_saved.jpg', img)
>>> img_read = imageio.imread('img_saved.jpg')
>>> img_read.dtype
dtype('uint8')

【讨论】:

  • “使用imageio.imsave ...应该可以解决这个问题”——该功能不存在。你的意思是.imwrite
  • @nh2 - 是的;编辑句子的那部分以匹配代码
  • @nh2 这很奇怪,这确实有效imageio.imsave('hello.jpg', maps,vmax=1,vmin=-1) 但是,我找不到任何文档!
【解决方案2】:

我会像这样在 TIFF 中写入和读取 16 位灰度数据:

#!/usr/local/bin/python3

import numpy as np
from PIL import Image

# Make a greyscale image of random 16-bit ints in range 0..65535
arr = np.random.randint(0,65535,(320,240), dtype=np.uint16)

# Make PIL image from numpy array and save
im=Image.fromarray(arr).save("result.tif")

# Re-read from file
reloadedim  = Image.open("result.tif")
reloadedarr = np.array(reloadedim)

# Calculate difference
diff = arr - reloadedarr
print("Number of different pixels: {}".format(sum(diff.ravel())))

它打印“不同像素的数量:0”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2012-03-24
    • 1970-01-01
    • 2012-12-03
    • 2020-01-07
    • 2018-08-18
    • 1970-01-01
    相关资源
    最近更新 更多