我可以用imsave()做一些带文字叠加的东西吗?

时间:2015-08-24 04:09:01

标签: animation numpy video matplotlib png

我正在使用imsave()按顺序制作许多我将合并为AVI的PNG,我想添加移动文本注释。我使用ImageJ来制作AVI或GIF。

我不想要轴,数字,边框或任何东西,只是颜色图像(例如imsave()提供),里面有文字(也许是箭头)。这些将逐帧改变。请原谅使用喷气式飞机。

我可以使用savefig()关闭滴答,然后裁剪作为后期处理,但是有更方便,直接或者#34; matplotlibithic"这样做的方法在我的硬盘上不会那么难吗? (最后的事情会很大)。

enter image description here

根据请求添加的代码段:

import numpy as np
import matplotlib.pyplot as plt

nx, ny = 101, 101

phi   = np.zeros((ny, nx), dtype = 'float')
do_me = np.ones_like(phi, dtype='bool')

x0, y0, r0 = 40, 65, 12

x = np.arange(nx, dtype = 'float')[None,:]
y = np.arange(ny, dtype = 'float')[:,None]
rsq = (x-x0)**2 + (y-y0)**2

circle = rsq <= r0**2

phi[circle] = 1.0
do_me[circle] = False

do_me[0,:], do_me[-1,:], do_me[:,0], do_me[:,-1] = False, False, False, False

n, nper = 100, 100
phi_hold = np.zeros((n+1, ny, nx))
phi_hold[0] = phi

for i in range(n):

    for j in range(nper):
        phi2 = 0.25*(np.roll(phi,  1, axis=0) +
                     np.roll(phi, -1, axis=0) +
                     np.roll(phi,  1, axis=1) +
                     np.roll(phi, -1, axis=1) )

        phi[do_me] = phi2[do_me]

    phi_hold[i+1] = phi

change = phi_hold[1:] - phi_hold[:-1]

places = [(32, 20), (54,25), (11,32), (3, 12)]

plt.figure()
plt.imshow(change[50])
for (x, y) in places:
    plt.text(x, y, "WOW", fontsize=16)
plt.text(5, 95, "Don't use Jet!", color="white", fontsize=20)
plt.show()

1 个答案:

答案 0 :(得分:1)

方法1

使用an excellent answer to another question作为参考,我提出了以下简化版本,它似乎运行良好 - 只需确保figsizewhich is given in inches)宽高比与大小比例匹配情节数据:

import numpy as np
import matplotlib.pyplot as plt

test_image = np.eye(100)
fig = plt.figure(figsize=(4,4))
ax = plt.axes(frameon=False, xticks=[],yticks=[])
ax.imshow(test_image)
plt.savefig('test.png', bbox_inches='tight', pad_inches=0)

请注意,我使用imshow test_image,其行为可能与其他绘图功能不同...如果您想要做其他事情,请在评论中告诉我。

另请注意,图像将被(重新)采样,因此figsize会影响书写图像的分辨率。

作为pointed out in the commentsfigsize设置与输出图像的大小(或屏幕上的大小)不匹配。要克服这个问题,请使用......

方法2

阅读FAQ条目Move the edge of an axes to make room for tick labels,我找到了一种方法,通过将轴的刻度移出可见区域,使figsize参数直接设置输出图像大小:

import numpy as np
import matplotlib.pyplot as plt

test_image = np.eye(100)
fig = plt.figure(figsize=(4,4))
ax = fig.add_axes([0,0,1,1])
ax.imshow(test_image)
plt.savefig('test.png')

请注意savefig有默认的DPI设置(在我的情况下为100),与figsize结合使用 - 确定保存图像的x和y方向的像素数。您可以使用dpi的{​​{1}}关键字参数覆盖此内容。

如果您想在屏幕上显示图像而不是保存图像(使用savefig而不是上面代码中的plt.show()行),图形的大小取决于(除了已经熟悉的plt.savefig参数) figure 的DPI设置,它也有一个默认值(我的系统为80)。通过将figsize关键字参数传递给dpi调用,可以覆盖此值。