为什么在matplotlib中,使用scikit-image加载的图像乘以0.5会显示更亮?

xggvc2p6  于 2023-10-24  发布在  其他
关注(0)|答案(2)|浏览(105)

我只是想在python中使用scikit-image加载的图像变暗。
如果我这样做:

test_image = io.imread("TestProvs2.bmp")

test_image = test_image * 0.5

show_map(test_image)

RGB值的数组确实会缩小,因此每个RGB值都是127.5。
然而,结果图像具有最大值(左=原始,右=新):x1c 0d1x

kcugc4gi

kcugc4gi1#

当你读取图像时,图像的数据类型是uint8。当你将其乘以0.5时,Python将其转换为float64,但图像必须是uint8,所以它给出了这个错误

Lossy conversion from float64 to uint8. Range [0.0, 127.5]. Convert image to uint8 prior to saving to suppress this warning.

你需要做的是手动将其转换为uint8

test_image = (test_image * 0.5).astype(np.uint8)

不要忘记导入numpy

import numpy as np

一般来说,使用OpenCV进行图像处理更好。

bkkx9g8r

bkkx9g8r2#

问题确实是数据类型,以及 matplotlib 如何处理它们。
当你有uint8类型的数据时,值的范围应该是从0到255。一个图像不需要是uint 8。它也可以有其他数据类型。
当你有float/float 64类型的数据时,值的范围 probably 预期是0.0.. 1.0。Matplotlib 预期是这样的。
如果你看到这样的警告,这将是一个问题的迹象:
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
由于您只是将值乘以0.5,因此值的范围为0.0..127.5
考虑到这一点,虽然预期的范围高达1.0,吹出所有的像素。
您可以通过适当缩放或显式转换为uint8来解决这个问题。

  • matplotlib* 完全可以用于显示目的。您只需查看文档,了解任何API将如何处理您的数据。

相关问题