使用 X 和 y 坐标计算直线方程时倾斜方向错误
Wrong slope direction while calculating line equation with X and y coordinates
我需要检测光栅化图像中的一些线条。检索所有 X 和 Y 坐标后,我可以设法完美地为水平线、垂直线和勉强对角线创建相应的线方程。
但我刚刚偶然发现了一个罕见的案例:
我给出以下 X 坐标:
[[283.5], [283.5], [283.5], [283.5], [284.0], [284.5], [285.0], [285.5], [286.0],
[287.5], [287.5], [287.5], [288.0], [289.0], [289.0], [289.5], [289.5], [290.0],
[290.0], [291.0], [292.0], [292.0], [292.0], [293.0], [293.0], [294.0], [294.0],
[294.0], [294.0], [295.0], [296.0], [296.0], [296.0], [297.0], [297.0], [298.0],
[298.0], [298.0], [298.0], [299.0], [299.0], [300.0], [300.5], [300.5], [301.0],
[301.5], [302.0], [302.5], [302.5], [302.5], [302.5], [303.0], [303.5], [304.5],
[305.0], [305.5], [306.0], [306.5], [307.0], [307.0], [307.0], [307.0]]
Y坐标如下:
[215.0, 214.0, 213.0, 212.0, 211.0, 210.0, 209.0, 208.0, 207.0, 206.0, 205.0, 204.0,
203.0, 202.0, 201.0, 200.0, 199.0, 198.0, 197.0, 196.0, 195.0, 194.0, 193.0, 192.0,
191.0, 190.0, 189.0, 188.0, 187.0, 186.0, 185.0, 184.0, 183.0, 182.0, 181.0, 180.0,
179.0, 178.0, 177.0, 176.0, 175.0, 174.0, 173.0, 172.0, 171.0, 170.0, 169.0, 168.0,
167.0, 166.0, 165.0, 164.0, 163.0, 162.0, 161.0, 160.0, 159.0, 158.0, 157.0, 156.0,
155.0, 154.0]
我得到以下 b
值:913.00073
m
为:-2.4654503
给出以下结果:
看来m
应该是正数。
我已经尝试使用 sklearn 的 LinearRegression 并手动进行,得到相同的方程结果。
def compute_line_equation_sklearn(self):
X = []
y = []
for slice in self._slices:
X.append([slice.center[1]])
y.append(slice.center[0])
lr = LinearRegression()
reg = lr.fit(X, y)
self._m = reg.coef_[0]
self._b = reg.intercept_
def compute_line_equation_manual(self):
X = []
pairs = []
for current_slice in self._slices:
X.append(current_slice.center[1])
pairs.append([current_slice.center[1], current_slice.center[0]])
sx = sy = sxx = sxy = syy = 0.0
n = len(pairs)
for x, y in pairs:
sx = sx + x
sy = sy + y
sxx = sxx + x * x
sxy = sxy + x * y
syy = syy + y * y
self._m = ((n * sxy) - (sx * sy)) / ((n * sxx) - sx ** 2)
self._b = (sy - (self._m * sx)) / n
self._r = ((n * sxy) - (sx * sy)) / (np.sqrt((n * sxx) - (sx ** 2)) *
np.sqrt((n * syy) - (sy ** 2)))
你能给我一些关于在这种情况下可能出错的提示吗?
在图像中,Y轴向下增加,从顶部的0开始。因此,要获得正确的结果,请在计算斜率之前翻转 Y 坐标的符号。
我需要检测光栅化图像中的一些线条。检索所有 X 和 Y 坐标后,我可以设法完美地为水平线、垂直线和勉强对角线创建相应的线方程。
但我刚刚偶然发现了一个罕见的案例:
我给出以下 X 坐标:
[[283.5], [283.5], [283.5], [283.5], [284.0], [284.5], [285.0], [285.5], [286.0],
[287.5], [287.5], [287.5], [288.0], [289.0], [289.0], [289.5], [289.5], [290.0],
[290.0], [291.0], [292.0], [292.0], [292.0], [293.0], [293.0], [294.0], [294.0],
[294.0], [294.0], [295.0], [296.0], [296.0], [296.0], [297.0], [297.0], [298.0],
[298.0], [298.0], [298.0], [299.0], [299.0], [300.0], [300.5], [300.5], [301.0],
[301.5], [302.0], [302.5], [302.5], [302.5], [302.5], [303.0], [303.5], [304.5],
[305.0], [305.5], [306.0], [306.5], [307.0], [307.0], [307.0], [307.0]]
Y坐标如下:
[215.0, 214.0, 213.0, 212.0, 211.0, 210.0, 209.0, 208.0, 207.0, 206.0, 205.0, 204.0,
203.0, 202.0, 201.0, 200.0, 199.0, 198.0, 197.0, 196.0, 195.0, 194.0, 193.0, 192.0,
191.0, 190.0, 189.0, 188.0, 187.0, 186.0, 185.0, 184.0, 183.0, 182.0, 181.0, 180.0,
179.0, 178.0, 177.0, 176.0, 175.0, 174.0, 173.0, 172.0, 171.0, 170.0, 169.0, 168.0,
167.0, 166.0, 165.0, 164.0, 163.0, 162.0, 161.0, 160.0, 159.0, 158.0, 157.0, 156.0,
155.0, 154.0]
我得到以下 b
值:913.00073
m
为:-2.4654503
给出以下结果:
看来m
应该是正数。
我已经尝试使用 sklearn 的 LinearRegression 并手动进行,得到相同的方程结果。
def compute_line_equation_sklearn(self):
X = []
y = []
for slice in self._slices:
X.append([slice.center[1]])
y.append(slice.center[0])
lr = LinearRegression()
reg = lr.fit(X, y)
self._m = reg.coef_[0]
self._b = reg.intercept_
def compute_line_equation_manual(self):
X = []
pairs = []
for current_slice in self._slices:
X.append(current_slice.center[1])
pairs.append([current_slice.center[1], current_slice.center[0]])
sx = sy = sxx = sxy = syy = 0.0
n = len(pairs)
for x, y in pairs:
sx = sx + x
sy = sy + y
sxx = sxx + x * x
sxy = sxy + x * y
syy = syy + y * y
self._m = ((n * sxy) - (sx * sy)) / ((n * sxx) - sx ** 2)
self._b = (sy - (self._m * sx)) / n
self._r = ((n * sxy) - (sx * sy)) / (np.sqrt((n * sxx) - (sx ** 2)) *
np.sqrt((n * syy) - (sy ** 2)))
你能给我一些关于在这种情况下可能出错的提示吗?
在图像中,Y轴向下增加,从顶部的0开始。因此,要获得正确的结果,请在计算斜率之前翻转 Y 坐标的符号。