【问题标题】:Altered image array when plotting with pyplot's imshow使用 pyplot imshow 绘图时更改的图像数组
【发布时间】:2020-11-25 11:11:18
【问题描述】:

因此,我和我的一些同事注意到,当我们使用 matplotlib.pyplot 的 imshow 函数显示二进制数组时,显示图像的边缘似乎发生了变化。有一段时间我以为这只是一个视觉工件,但今天又遇到了麻烦。

顺便说一句,我正在使用 matplotlib:3.2.2 和 numpy:1.19.1

如果我创建一个小的二进制数组并将其绘制出来,您可以在图像中的二进制框中看到一个小的“光环”。这不是很明显,但确实存在:

import matplotlib.pyplot as plt
import numpy as np

img=np.zeros((100,100))
img[25:60,25:60]=50
plt.imshow(img)

如果我更改绘图的 cmap,它会变得更加明显。

my_cmap = plt.cm.get_cmap('prism')
my_cmap.set_under('black')
plt.imshow(img,cmap=my_cmap, vmin=1)

显示的数组应该只有0作为背景和1在框中,但框显示为带有红色/黄色边框的绿色框。

在以前版本的 pyplot 中我没有遇到过这个问题,当我进行对象检测并且我想显示它们并且我的其他明智的二进制对象最终变成这样时,它确实成为了一个问题:

希望你能帮我解决这个问题

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    imshow 不知道您的数据是离散的甚至是二进制的。默认它添加了一些插值。您可以使用imshow(...., interpolation='none')(或interpolation='nearest')抑制平滑插值。

    请注意,默认模式为'antialiased',其效果取决于图像像素占用的屏幕像素数。 详情请见the official matplotlib documentation

    下面是一些测试代码,比较不同图像尺寸的默认和'none' 插值模式:

    from matplotlib import pyplot as plt
    import numpy as np
    
    x = np.round(10 + np.random.uniform(-.1, .1, (100, 100)).cumsum(axis=0).cumsum(axis=1))
    x[x % 2 == 0] = x.max() + 1
    fig, axes = plt.subplots(2, 6, figsize=(14, 5))
    for i, axrow in enumerate(axes):
        for j, ax in enumerate(axrow):
            k = 10 * (j + 5)
            ax.imshow(x[-k:, -k:], cmap='Dark2', interpolation=None if i == 0 else 'none')
            ax.set_title("size={}\ninterpolation={}".format(k, 'None' if i == 0 else "'none'"))
    plt.tight_layout()
    plt.show()
    

    这是另一个示例,使用“地震”颜色图和仅两个数据值。此颜色图在极端处有深蓝色和红色,在中心附近有白色,这表明插值更加发音:

    【讨论】:

    • 非常感谢您帮我解决这个问题!这让我发疯了
    猜你喜欢
    • 2016-07-25
    • 2022-01-07
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2022-06-25
    相关资源
    最近更新 更多