matplotlib 将 输入 数据 剪切 到 imshow 的 有效 范围 ( 对于 浮点 数 为 [ 0..1 ] , 对于 整数 为 [ 0..255 ] )

ibps3vxo  于 2022-11-15  发布在  其他
关注(0)|答案(8)|浏览(194)

在将MRI切片转换为PNG格式后,我尝试对它运行图形切割算法。我一直遇到以下问题:

Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).

即使在如下设置vminvmax之后,也是如此:

plt.imshow(out, vmin=0, vmax=255)
toiithl6

toiithl61#

在缩放[0, 255]范围后将图像转换为np.uint8将消除此警告。这似乎是matplotlib中的一个功能,如本issue中所讨论的。

plt.imshow((out * 255).astype(np.uint8))
e5njpo68

e5njpo682#

plt.imshow(out.astype('uint8'))代替plt.imshow(out),就是这样!

qqrboqgw

qqrboqgw3#

如果要显示它,可以使用img/255
或者

np.array(img,np.int32)

原因是,如果颜色强度是浮点数,则matplotlib expects的取值范围为0到1。如果是int,则取值范围为0到255。因此,您可以将所有数值强制为int,也可以将它们全部缩放1/255。

gojuced7

gojuced74#

正如警告所说的,它正在剪切(0,1)之间的数据....我尝试了上述方法,警告消失了,但我的图像有丢失的像素值。所以我尝试以下步骤为我的numpy数组图像(64,64,3)。步骤1:检查数组的最小值和最大值

maxValue = np.amax(Image)
minValue = np.amin(Image)

对于我的情况,图像的最小值为负值,最大值为正值,但所有值都在大约(-1,1.5)之间,因此步骤2:我只是在显示之前将数据剪切了

Image = np.clip(Image, 0, 1)
plt.imshow(Image)

请注意,如果您的像素值范围类似于(-84,317)等,则可以使用以下步骤

Image = Image/np.amax(Image)
Image = np.clip(Image, 0, 1)
plt.imshow(Image)
uajslkp6

uajslkp65#

只需将其设置在此范围[0:1]内

如果在调用amax()和amin()之后,它介于[-1,1]之间,则

img = img / 2 + 0.5

如果介于[0,250]之间

img = img / 250
pbossiut

pbossiut6#

plt.show(Image)如果图像dtype为float,则图像范围应在0到1之间;如果图像dtype为int,则图像范围应在0-255之间

输入image.dtype如果它是浮点数那么问题是它的范围是-1到1,你需要使范围在0和1之间,这是你做它的方法:

image=(image+1)/2

如果'image.dtype outputint,则问题在于值为0和1,且其类型为int,因此将类型转换为float

np.array(img,np.float32)

或将图像的多个值乘以255,使0和1之间的值变为0和255之间的值

img=img*255

参考https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.pyplot.imshow.html

yqlxgs2m

yqlxgs2m7#

对于基于Pytorch的grad_cam,我在show_cam_on_image中也遇到了类似的错误,而工作正常的是

input_image = Image.open(filename)
img=np.array(input_image.resize((227,227)),np.float32)
img *= (1.0/img.max())
xienkqul

xienkqul8#

只需使用.astype("uint8"),因此您应该得到如下内容:

plt.imshow(image.astype("uint8"))

相关问题