У меня есть изображение 256x256, и я хочу иметь возможность построить линию регрессии через точки. Для этого я преобразовал изображение в диаграмму рассеяния, а затем попытался преобразовать диаграмму рассеяния обратно в массив. Тем не менее, преобразование обратно в массив Numpy сделало массив NumPy 480x640.
Может ли кто-нибудь объяснить мне, почему форма меняется, в основном, почему это уже не квадратное изображение, и если есть какое-либо преобразование, чтобы исправить это?
Создание моих точек x и y из двоичного изображения
imagetile = a[2]
x, y = np.where(imagetile>0)
imagetile.shape
Выход: (256 л, 256 л)
Версия 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
Выход: (480 л, 640 л, 4 л)
Версия 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
Выход: (640 л, 480 л, 4 л)
Спасибо