将 matplotlib 图形转换为相同形状的 numpy 数组

我有一个 256x256 的图像,我希望能够通过这些点绘制一条回归线。为此,我将图像转换为散点图,然后尝试将散点图转换回 numpy 数组。但是,转换回 numpy 数组会使 numpy 数组变为 480x640。


谁能向我解释为什么形状会发生变化,主要是为什么它不再是方形图像,以及是否有任何转换可以修复它?


从二进制图像制作我的 x 和 y 点

imagetile = a[2]

x, y = np.where(imagetile>0)

imagetile.shape

输出:(256L,256L)


版本 1

from numpy import polyfit

from numpy import polyval


imagetile = a[2]

x, y = np.where(imagetile>0)


from numpy import polyfit

from numpy import polyval


p2 = polyfit(x, y, 2)


fig = plt.figure()

ax = fig.add_axes([0.,0.,1.,1.])

xp = np.linspace(0, 256, 256)

plt.scatter(x, y)

plt.xlim(0,256)

plt.ylim(0,256)

plt.plot(xp, polyval(p2, xp), "b-")

plt.show()


fig.canvas.draw()

X = np.array(fig.canvas.renderer._renderer)

X.shape

输出:(480L、640L、4L)


版本 2

def fig2data ( fig ):

    """

    @brief Convert a Matplotlib figure to a 4D numpy array with RGBA channels and return it

    @param fig a matplotlib figure

    @return a numpy 3D array of RGBA values

    """

    # draw the renderer

    fig.canvas.draw ( )

 

    # Get the RGBA buffer from the figure

    w,h = fig.canvas.get_width_height()

    buf = np.fromstring ( fig.canvas.tostring_argb(), dtype=np.uint8 )

    buf.shape = ( w, h,4 )

 

    # canvas.tostring_argb give pixmap in ARGB mode. Roll the ALPHA channel to have it in RGBA mode

    buf = np.roll ( buf, 3, axis = 2 )

    return buf


figure = matplotlib.pyplot.figure(  )

plot   = figure.add_subplot ( 111 )

 


x, y = np.where(imagetile>0)

p2 = polyfit(x, y, 2)

plt.scatter(x, y)

plt.xlim(0,256)

plt.ylim(0,256)

plt.plot(xp, polyval(p2, xp), "b-")


data = fig2data(figure)

data.shape

输出:(640L、480L、4L)


谢谢


MM们
浏览 192回答 1
1回答

慕工程0101907

如果您在不设置参数 figsize 的情况下调用matplotlib.pyplot.figure,它将采用默认形状(引用自文档):figsize : (float, float),可选,默认值:无 宽度,高度,以英寸为单位。如果未提供,则默认为 rcParams["figure.figsize"] = [6.4, 4.8]。所以,你可以通过这样做来设置形状matplotlib.pyplot.figure(figsize=(2.56,2.56))不知道您的数据是什么样的,我认为您的方法相当迂回,所以,我建议这样:import numpy as npimport matplotlib.pyplot as plt# generating simulated polynomial data:arr = np.zeros((256, 256))par = [((a-128)**2, a) for a in range(256)]par = [p for p in par if p[0]<255]arr[zip(*par)] = 1x, y = np.where(arr>0)p2 = np.polyfit(y, x, 2)xp = np.linspace(0,256,256)plt.imshow(arr) # show the image, rather than the conversion to datapointsp = np.poly1d(p2) # recommended in the documentation for np.polyfitplt.plot(xp, p(xp))plt.ylim(0,256)plt.xlim(0,256)plt.show()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python