Python:2D 图像的 3D 轮廓 - pylab 和contourf

2023-11-29

我有一个关于 Python(pylab) 和绘图的问题 - 我能够加载并显示图像(下面的代码加载下面的图像),但我无法将其绘制为 3D 轮廓,我知道需要一个数组pylab.contourf(x,y,z)虽然我不确定如何从加载的图像数据中实现这一点。

如有任何建议和帮助,请。我的代码:

from PIL import Image
import pylab

fileName = "image1.png"
im = Image.open(fileName)
#pylab.contourf(im) # don't work - needs an array but how
pylab.axis('off')
pylab.imshow(im)
pylab.show()

image1.png


您的图像可以用等高线图表示的原因是它显然是伪彩色图像,即使用完整 RGB 色谱来表示单个变量的图像。等值线图还表示具有单个变量的数据它决定颜色(即 Z 轴),因此您也可以将图像数据表示为等高线图。

这就是原因我建议您首先使用等高线图。 (不过,您在这个问题中实际要求的内容通常不存在:没有普遍有效的方法来转换颜色image转换为等高线图,因为彩色图像通常具有三种独立的颜色 RGB,而等高线图只有一种(Z 轴),i.e.,这只适用于伪彩色图像。)

具体解决您的问题:

1) 如果您有用于创建所显示的伪彩色图像的 z 轴数据,只需在等值线图中使用该数据即可。这是最好的解决方案。

2)如果你没有z数据,那就更麻烦了,因为你需要将图像中的颜色反转为z值,然后将其放入等高线图中。您显示的图像几乎肯定使用了颜色图 matplotlib.cm.jet,而且我看不到比它更好的反转方法ubuntu在这里说.

最后,您需要了解等高线图和图像之间的区别,才能使细节发挥作用。

演示原因convert不起作用:
在这里,我使用从左到右的 z 值斜坡来运行完整的测试用例。很明显,z 值现在完全混乱了,因为以前最大的值现在是最小的,等等。

也就是说,目标是图。 2 匹配图。 4,但它们有很大不同。当然,问题是convert未正确映射jet到原始 z 值集。

enter image description here

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

fig, axs = plt.subplots(4,1)

x = np.repeat(np.linspace(0, 1, 100)[np.newaxis,:], 20, axis=0)

axs[0].imshow(x, cmap=plt.cm.gray)
axs[0].set_title('1: original z-values as grayscale')

d = axs[1].imshow(x, cmap=plt.cm.jet)
axs[1].set_title('2:original z-values as jet')    
d.write_png('temp01.png')  # write to a file

im = Image.open('temp01.png').convert('L')  # use 'convert' on image to get grayscale
data = np.asarray(im)  # make image into numpy data
axs[2].imshow(data, cmap=plt.cm.gray)
axs[2].set_title("3: 'convert' applied to jet image")

img = Image.open('temp01.png').convert('L')
z   = np.asarray(img)
mydata = z[::1,::1]  # I don't know what this is here for
axs[3].imshow(mydata,interpolation='nearest',cmap=plt.cm.jet)
axs[3].set_title("4: the code that Jake French suggests")

plt.show()

但是,正如我上面建议的那样,正确地做到这一点并不难。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:2D 图像的 3D 轮廓 - pylab 和contourf 的相关文章