【问题标题】:Matplotlib imshow adjacent images with anomalous whitespace - is there a way to correct it?Matplotlib imshow 具有异常空白的相邻图像 - 有没有办法纠正它?
【发布时间】:2012-09-14 19:03:58
【问题描述】:

我正在以类似于下面显示的工作代码的方式绘制平铺图像:

import Image
import matplotlib.pyplot as plt
import random
import numpy

def r():
    return random.randrange(50,200)

imsize = 100
rngsize = 5

rng = range(rngsize)
for i in rng:
    for j in rng:
        im = Image.new('RGB', (imsize, imsize), (r(),r(),r()))
        plt.imshow(im, aspect='equal', extent=numpy.array([i, i+1, j, j+1])*imsize)

plt.xlim(-5,imsize * rngsize + 5)
plt.ylim(-5,imsize * rngsize + 5)
plt.show()

问题是:当您平移和缩放时,图像边缘之间会出现与缩放比例无关的白色条纹,这是非常不受欢迎的。我想这与重采样和抗锯齿有关,但不知道如何“以正确的方式”解决它,特别是因为不知道 matplotlib 渲染引擎的确切实现细节。

使用 Cairo 和 HTML Canvas,您可以绘制“到像素角”或“到像素中心”(平移 0.5 像素),从而避免抗锯齿效果。有没有办法用 Matplotlib 做到这一点?

感谢您的帮助!

【问题讨论】:

    标签: image plot matplotlib antialiasing


    【解决方案1】:

    您可以简单地将值填充到更大的 numpy 数组中,并一次绘制整个合成图像。我已经将上面的代码调整为一个最小的示例,但是对于不同大小的图像,您需要采用不同的步长。

    F = numpy.zeros((imsize*rngsize,imsize*rngsize,3))
    
    for i in rng:
        for j in rng:
            F[i*imsize:(i+1)*imsize, 
              j*imsize:(j+1)*imsize, :] = (r(), r(), r())
    
    plt.imshow(F, interpolation = 'nearest')
    plt.show()
    

    【讨论】:

    • 这是个好主意,我想我可能可以用我的源图像以很快的速度做到这一点(我猜无论如何 mpl 都必须这样做)。但它仍然让我觉得是某种解决方法。如果我没有任何神奇的选择,我会回来接受这个。非常感谢!
    • @heltonbiker 我承认这似乎是一种 hack,但如果您想应用任何后置过滤器,最终您可以更好地控制合成图像。另外,如果你想保存合成图像,这正是我会使用的方法(并且完全绕过 PIL 和 matplotlib!)
    • 其实我想直接使用matplotlib作为GUI制作一个平移地图“程序”。一个目标是在地图平移时加载和卸载切片,始终只绘制所需的图像。这可能会或可能不会比每次我释放鼠标时生成一个新图像更轻(这是我计划用来刷新要绘制的图块列表的事件)。很可能,使用你的答案可以解决问题,所以我只会在接受之前再等一会儿,以防万一。
    • @heltonbiker 您可能会尝试加载比视口更大的数组(例如每个方向 3-4 个图块),这样您就不必重新加载数组每次鼠标移动。仅当您的“缓冲区”变为〜1个标题时才重新加载。你会以一些额外的内存为代价获得巨大的加速。
    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多