欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

html5图像映射坐标怎么看,如何将AxesImage中的坐标映射到已保存图像文件中的坐标?...

发布时间:2023/12/15 编程问答 30 豆豆
生活随笔 收集整理的这篇文章主要介绍了 html5图像映射坐标怎么看,如何将AxesImage中的坐标映射到已保存图像文件中的坐标?... 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

这是尝试从matplotlib获取精确像素值的更令人困惑的部分之一. Matplotlib将绘制精确像素值的渲染器与绘制图形和轴的画布分开.

基本上,最初创建(但尚未显示)图形时存在的渲染器不一定与显示图形或将其保存到文件时使用的渲染器相同.

你正在做的是正确的,但是它使用的是初始渲染器,而不是保存图形时使用的渲染器.

为了说明这一点,这里是您的代码的略微简化版本:

import numpy as np

import matplotlib.pyplot as plt

fig = plt.figure()

ax = fig.add_subplot(111)

im = ax.imshow(np.random.random((27,27)), interpolation='nearest')

for i in range(28):

x, y = ax.transData.transform_point([i,i])

print '%i, %i' % (x, fig.bbox.height - y)

fig.savefig('foo.png', dpi=fig.dpi)

这会产生与上面相似的结果:(差异是由于您的机器和我的机器之间的渲染后端不同)

89, 55

107, 69

125, 83

...

548, 410

566, 424

585, 439

但是,如果我们做同样的事情,而是在显示坐标之前绘制图形,我们得到正确的答案!

import numpy as np

import matplotlib.pyplot as plt

fig = plt.figure()

ax = fig.add_subplot(111)

im = ax.imshow(np.random.random((27,27)), interpolation='nearest')

fig.canvas.draw()

for i in range(28):

x, y = ax.transData.transform_point([i,i])

print '%i, %i' % (x, fig.bbox.height - y)

fig.savefig('foo.png', dpi=fig.dpi)

这产生:(记住,数字的边缘在数据坐标中是< -0.5,-0.5>而不是< 0,0>.(即绘制图像的坐标是以像素为中心的).是为什么< 0,0>得到143,55,而不是135,48)

143, 55

157, 69

171, 83

...

498, 410

512, 424

527, 439

当然,绘制图形只是为了在保存时再次绘制它是多余的并且计算成本很高.

为避免两次绘制,可以将回调函数连接到绘图事件,并在此函数中输出HTML图像映射.作为一个简单的例子:

import numpy as np

import matplotlib.pyplot as plt

def print_pixel_coords(event):

fig = event.canvas.figure

ax = fig.axes[0] # I'm assuming there's only one subplot here...

for i in range(28):

x, y = ax.transData.transform_point([i,i])

print '%i, %i' % (x, fig.bbox.height - y)

fig = plt.figure()

ax = fig.add_subplot(111)

im = ax.imshow(np.random.random((27,27)), interpolation='nearest')

fig.canvas.mpl_connect('draw_event', print_pixel_coords)

fig.savefig('foo.png', dpi=fig.dpi)

这样可以产生正确的输出,同时只保存一次,保存时:

143, 55

157, 69

171, 83

...

498, 410

512, 424

527, 439

另一个优点是你可以在调用fig.savefig时使用任何dpi,而无需事先手动设置无花果对象的dpi.因此,当使用回调函数时,你可以只做fig.savefig(‘foo.png’),(或fig.savefig(‘foo.png’,dpi = what))你会获得与保存匹配的输出.png文件. (保存图形时的默认dpi为100,而图形对象的默认dpi为80,这就是为什么必须首先指定dpi与fig.dpi相同)

希望这至少有点清楚!

总结

以上是生活随笔为你收集整理的html5图像映射坐标怎么看,如何将AxesImage中的坐标映射到已保存图像文件中的坐标?...的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。