Matplotlib从一个全为1的数组中生成黑色图像

Jul*_*lep 2 python image-processing matplotlib

介绍

我正在与做一些测试matplotlib.pyplot。当我尝试保存人造图像时,我陷入了一种奇怪的行为。这是我创建的用于保存图像的非常简单的功能:

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

def save_image(array, name):

    array = array*255.
    fig = plt.figure()
    plt.imsave(name, array.astype('uint8'), cmap=matplotlib.cm.gray)
    plt.close(fig)

return 0
Run Code Online (Sandbox Code Playgroud)

问题

当我尝试创建一个由零组成的数组的图像时,得到的图像很暗,如预期的那样:

zeros_array = np.zeros((200,200), dtype='float')
save_image(zeros_array, 'Dark.jpg')
Run Code Online (Sandbox Code Playgroud)

Dark.jpg

但是,当我尝试创建一个包含一个全为1的数组的图像时,仍然会得到深色图像:

ones_array = np.ones((200,200), dtype='float')
save_image(ones_array, 'White.jpg')
Run Code Online (Sandbox Code Playgroud)

White.jpg

有趣的是,当我创建一个mixed_array具有不同强度正方形的时,充满了这些区域的区域现在显示为白色:

mixed_array = np.ones((200,200), dtype='float')
mixed_array[:100,:100] = 0.25
mixed_array[100:,100:] = 0.75
save_image(mixed_array, 'Mixed.jpg')
Run Code Online (Sandbox Code Playgroud)

Mixed.jpg

题 :

有谁知道为什么matplotlib拒绝保存完整的白色图像,但是图像中的白色区域没有问题?

我可能缺少一些非常明显或基本的内容,但我看不到。

tmd*_*son 5

我认为您要设置vmin和并vmax在致电时imsave。如果不这样做,它将自动从数组中确定。从文档

vmin / vmax:[无| 标量]

vmin和vmax通过固定映射到颜色图颜色限制的值来设置图像的颜色缩放比例。如果vmin或vmax为None,则该限制由arr min / max值确定。

因此,尝试将功能更改为:

def save_image(array, name):

    array = array*255.
    fig = plt.figure()
    plt.imsave(name, array.astype('uint8'), cmap=matplotlib.cm.gray, vmin=0, vmax=255)
    plt.close(fig)
Run Code Online (Sandbox Code Playgroud)