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

Har*_*ime 2 python 3d plot matplotlib

我有一个关于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()
Run Code Online (Sandbox Code Playgroud)

image1.png

tom*_*m10 5

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

这就是我建议你首先使用等高线图的原因.(你在这个问题中实际要求的是,通常不存在:没有通常有效的方法将彩色图像转换成等高线图,因为彩色图像通常有三种独立的颜色,RGB和等高线图只有一个(Z轴),,这仅适用于伪彩色图像.)

要专门解决您的问题:

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

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

最后,您需要了解轮廓图和图像之间的差异,以使细节工作.

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

也就是说,目标是图.2匹配图.4,但他们是非常不同的.当然,问题是convert没有正确映射jet到原始的z值集.

在此输入图像描述

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()
Run Code Online (Sandbox Code Playgroud)

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