Я рисую 2D-эллипс на пустом изображении.Теперь я хочу провести линию через эллипс, чтобы получить большую ось.Зная, что существует множество вариантов (PCA, моменты изображения и т. Д.), Я подумал, что линейная регрессия должна сделать эту работу.Однако, это только «работает», если вращение эллипса параллельно оси x.Почему это?Разве любое симметричное облако точек, которое распределено одинаково, не дает среднюю линию?
Это код, который я использовал:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from skimage.draw import ellipse
from ipywidgets import interact
from sklearn.linear_model import LinearRegression
@interact
def rotateAndFit(rot:(-90,90)=-90):
im = np.zeros((300,300), dtype=np.float64)
im[ellipse(im.shape[0]//2, # center x
im.shape[1]//2-10, # center y
120, # radius major axis
40, # radius minor axis
im.shape, # image shape
rot/180*np.pi)] = 1 # rotation angle in degree,
# Get corresponding x and y values
y, x = np.where(im)
# Do Linear Regression
lr = LinearRegression()
lr.fit(x[None].T,y)
plt.imshow(im)
plt.plot([0, 300], [lr.intercept_, lr.coef_[0]*300+lr.intercept_])
plt.axis([0,300,300,0])
plt.title('rotation $r = {}°$'.format(rot))
Код обеспечивает следующий вывод:
Я действительно смущен, есть идеи?Я использовал гребень и регрессию лассо, чтобы отрегулировать веса, но они понижают веса, но кажется, что веса, то есть наклон должен быть круче, я думаю, что линейная регрессия недооценивает наклон.Интересно, что линейная регрессия часто является своего рода «точечной» симметрией, но не симметричной по всей линии ... Я понимаю, что поведение близко к 0 °, наклон не может быть бесконечным.Но это должно по крайней мере работать для низкой степени вращения.