Python 3.x misc.imread和misc.imsave更改像素值

Python 3.x misc.imread和misc.imsave更改像素值,python-3.x,image-processing,scipy,Python 3.x,Image Processing,Scipy,我是: 读取灰度图像 执行所有像素值的标准化,然后 保存图像 当我重新打开图像时,我看到不同的像素值 我的代码片段: image = misc.imread('lena.jpg') maximum = np.max(image) # finds maximum pixel value of image img = np.divide(image, maximum) # divide every pixel value by maximum # scale every pixel va

我是:

  • 读取灰度图像
  • 执行所有像素值的标准化,然后
  • 保存图像
当我重新打开图像时,我看到不同的像素值

我的代码片段:

image = misc.imread('lena.jpg')  
maximum = np.max(image) # finds maximum pixel value of image  
img = np.divide(image, maximum) # divide every pixel value by maximum
# scale every pixel value between 0 and 127
img_scale = np.round(img * (np.power(2,7)-1)).astype(int)  
misc.imsave('lena_scaled.jpg', img_scale)  
img_reopen = misc.imread('lena_scaled.jpg')
当我比较
img\u比例
img\u重新打开
时,我得到不同的值:

By executing np.max(img_scale), I get 127.
By executing np.max(img_reopen), I get 255
By executing img_scale[0][0], I get [82,82,82]
By executing img_reopen[0][0], I get [156][156][156]
问题


为什么保存图像并重新打开后像素值会发生更改?

imsave功能会在图像保存到磁盘时重新缩放图像

misc.imsave
功能使用发动机罩下的
bytescale
将图像重新缩放到全范围(0255)

这就是为什么重新打开时会得到
np.max
255。请参阅文档

跟进: 要在不重新缩放的情况下保留值,您可以尝试使用
misc.toimage
函数并按如下方式保存结果:

im = misc.toimage(img_scale, high=np.max(img_scale), low=np.max(img_scale)
im.save('lena_scaled.jpg')
使用
misc.imsave
阅读
'lena\u scaled.jpg'
时,您可以尝试使用以下方法:

misc.imread('lena_scaled.jpg', mode='I')
I-‘L’(8位像素,黑白) 我相信这对你的灰度图像有用


希望这能有所帮助。

scipy提到toimage已被弃用。使用Pillow和fromarray函数:例如,将结果保存为uint8图像:
Image.fromarray(np.uint8(numpyar)).save(resfilepath)