【问题标题】:How to create surface plot from greyscale image with Matplotlib?如何使用 Matplotlib 从灰度图像创建曲面图?
【发布时间】:2015-10-26 15:19:24
【问题描述】:

假设我有一张灰度图像(尺寸:550x150 像素)。我用 matplolib 加载图像

import matplotlib.pyplot as plt
import matplotlib.image as mp_img
image = mp_img.imread("my-cat.png")
plt.imshow(image)
plt.show()

现在,plt.imshow 在屏幕上显示图像。但我想要的是灰度值的表面图,如下所示:

.Colour 并不是必需品,但它对高度线很有帮助。我知道,我需要f(x,y) -> z 形式的函数来创建曲面图。所以,我想在我的图像中使用(x_pixel,y_pixel) 的灰度值来获得f 的值。这导致了我的问题:

  • 我想在绘图期间对我的图像值进行一些插值(例如平滑)。这也取决于我的网格的大小,那么我该如何控制呢?而且,
  • 如何从我的图像中绘制灰度值的曲面图?

【问题讨论】:

    标签: python matplotlib plot smooth


    【解决方案1】:
    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    import cv2
    
    # generate some sample data
    import scipy.misc
    lena = cv2.imread("./data/lena.png", 0)
    
    # downscaling has a "smoothing" effect
    lena = cv2.resize(lena, (100,100))
    
    # create the x and y coordinate arrays (here we just use pixel indices)
    xx, yy = np.mgrid[0:lena.shape[0], 0:lena.shape[1]]
    
    # create the figure
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    ax.plot_surface(xx, yy, lena ,rstride=1, cstride=1, cmap=plt.cm.jet,
                    linewidth=0)
    
    # show it
    plt.show()
    

    如果要获取彩色图,请将代码更改为:“cmap=plt.cm.jet”。 所以你可以得到这样的东西: color plot

    【讨论】:

      【解决方案2】:

      所以这很简单。加载数据,构建绘图:

      import numpy as np
      import matplotlib.pyplot as plt
      from mpl_toolkits.mplot3d import Axes3D
      
      # generate some sample data
      import scipy.misc
      lena = scipy.misc.lena()
      
      # downscaling has a "smoothing" effect
      lena = scipy.misc.imresize(lena, 0.15, interp='cubic')
      
      # create the x and y coordinate arrays (here we just use pixel indices)
      xx, yy = np.mgrid[0:lena.shape[0], 0:lena.shape[1]]
      
      # create the figure
      fig = plt.figure()
      ax = fig.gca(projection='3d')
      ax.plot_surface(xx, yy, lena ,rstride=1, cstride=1, cmap=plt.cm.gray,
              linewidth=0)
      
      # show it
      plt.show()
      

      结果:

      【讨论】:

      • 150 * 0.15 ~ 22mesh 指出,如果我能更详细地解析结构,那就太好了。我知道这是一个非常笼统的陈述,但我正在寻找一种平滑过滤器,它可以在高对比度和强烈变化的渐变的情况下保留细节。无论如何,如果您添加双边过滤器或类似的东西,我会接受您的回答。
      • 接受与否,如你所愿。这不是一项编码服务,您可以在其中要求您想要的东西。展示您尝试过的方法并描述您遇到困难的地方。
      • 令我困惑的是,当我尝试从使用示例数据(例如img = scipy.misc.lena())的示例转移到真实数据(例如img = imread('20141007225851_145162701.png)时,我得到ValueError:形状不匹配: 两个或多个数组在轴 1 上具有不兼容的维度 两者之间存在明显差异(当 np 数组来自 imread 而不是 misc.data 时,它嵌套更深一层)但我并不完全正确确定原因,但使用img[0] 不起作用,尽管数据格式看起来相同,但事件。我意识到我错过了一些愚蠢的东西,很烦人
      • 我想通了——你必须确保xx.shape, yy.shape, lena.shape 都是一样的;在我的情况下,我正在读取的 img 实际上是一个 rgb 文件,所以我必须添加 from skimage.color import rgb2gray; gray_img = rgb2gray(img),然后 ax.plot_surface(xx, yy, img_sm ...) 工作正常。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 2017-08-30
      相关资源
      最近更新 更多