我目前正在尝试编写一个用作近似方法的程序。主要思想是在较大的几何对象中“挖洞”,例如填充圆,可以使用Matplotlib进行如下操作:
from numpy import *
import matplotlib.pyplot as plt
phi = linspace(0, 2*pi, 200)
plt.fill(cos(phi), sin(phi), 'black')
precision = 20
for j in xrange(20):
for i in xrange(precision):
plt.fill((cos(phi)+j*cos(i*2*pi/precision))/precision, (sin(phi)+j*sin(i*2*pi/precision))/precision, 'white')
plt.show()
这会生成一个漂亮的小图像,总共有1 + 20*precision = 401
个“子图”,即圆圈。对于我的应用程序,我实际上需要几十亿或更多的这些,这可以理解地产生错误(没有足够的内存,因为Matplotlib在绘制后仍然保留所有绘图,如果我想保留最终结果,我无法清除它们)。因此,我尝试将绘图保存为图像并在迭代期间重新加载:
for j in xrange(20):
for i in xrange(precision):
plt.fill((cos(phi)+j*cos(i*2*pi/precision))/precision, (sin(phi)+j*sin(i*2*pi/precision))/precision, 'white')
plt.axis("off")
plt.savefig("temp.png", bbox_inches = 'tight', pad_inches=0)
plt.close("all")
im = plt.imread("temp.png")
plt.imshow(im, extent = [-1.0, 1.0, -1.0, 1.0])
这几乎可以正常工作:图像被正确保存,但左侧和底部似乎总是有轻微的填充,这会破坏整个过程,就像在每一步中图像向右移动一样。
我尝试了一切可能的方法来删除这个填充,但我找不到解决方案了。我试图手动创建轴(因为我认为填充是由于标签留下的空间等),但这也失败了。
如果有人知道如何删除这个填充,我会非常高兴。
答案 0 :(得分:0)
一种解决方案可能是裁剪图像。您可以按照here所述执行此操作。如果您确切知道边框有多大,可以像这样切割边框:
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
data = np.arange(3000).reshape((100,30))
plt.imshow(data)
plt.savefig('test.png', bbox_inches='tight')
img = Image.open('test.png')
width, height = img.size
img2 = img.crop((35,15,width-8,height-35))
img2.save('test2.png')
在这里,我发现35,15,8和35使用了反复试验。
导致此图片无边框: