Python 2.7 样条三维曲线拟合
我写了一个程序参考,为40点三维样条拟合创建768x480遮罩 但是,将40点更改为144点,将768x480更改为1920x1080,结果将变得不平滑 我如何修改代码,或任何其他工具,可以做到这一点Python 2.7 样条三维曲线拟合,python-2.7,scipy,curve-fitting,spline,Python 2.7,Scipy,Curve Fitting,Spline,我写了一个程序参考,为40点三维样条拟合创建768x480遮罩 但是,将40点更改为144点,将768x480更改为1920x1080,结果将变得不平滑 我如何修改代码,或任何其他工具,可以做到这一点 asciiDataInColumns_3D = ''' 60 60 246.09 60 180 245.07 60 300 243.63 60 420 242.64 60 540 240.39 60 660 241.09 60 780 243.78 60 900 244.35 6
asciiDataInColumns_3D = '''
60 60 246.09
60 180 245.07
60 300 243.63
60 420 242.64
60 540 240.39
60 660 241.09
60 780 243.78
60 900 244.35
60 1020 249.19
180 60 242.50
180 180 241.37
180 300 242.78
180 420 240.25
180 540 238.87
180 660 249.34
180 780 243.21
180 900 244.21
180 1020 247.70
300 60 242.50
300 180 241.37
300 300 241.37
300 420 240.39
300 540 240.81
300 660 243.92
300 780 240.39
300 900 251.91
300 1020 255.00
420 60 244.64
420 180 244.64
420 300 243.63
420 420 243.49
420 540 242.78
420 660 242.35
420 780 243.78
420 900 243.78
420 1020 246.23
540 60 245.80
540 180 246.23
540 300 245.22
540 420 245.36
540 540 243.78
540 660 242.78
540 780 242.35
540 900 242.50
540 1020 243.06
660 60 245.65
660 180 246.53
660 300 246.38
660 420 245.51
660 540 243.92
660 660 241.93
660 780 240.11
660 900 238.46
660 1020 240.67
780 60 245.51
780 180 247.55
780 300 247.55
780 420 248.00
780 540 244.93
780 660 241.93
780 780 240.39
780 900 238.32
780 1020 238.87
900 60 245.80
900 180 247.70
900 300 246.67
900 420 245.80
900 540 244.64
900 660 243.06
900 780 239.15
900 900 236.69
900 1020 236.15
1020 60 247.70
1020 180 248.00
1020 300 247.11
1020 420 245.51
1020 540 243.21
1020 660 240.67
1020 780 238.05
1020 900 235.62
1020 1020 235.22
1140 60 247.55
1140 180 248.15
1140 300 246.96
1140 420 245.36
1140 540 242.78
1140 660 239.28
1140 780 237.37
1140 900 234.29
1140 1020 234.55
1260 60 247.26
1260 180 246.53
1260 300 245.22
1260 420 242.78
1260 540 241.23
1260 660 237.50
1260 780 236.69
1260 900 234.16
1260 1020 234.95
1380 60 246.53
1380 180 245.07
1380 300 243.06
1380 420 240.67
1380 540 237.91
1380 660 235.35
1380 780 234.69
1380 900 233.89
1380 1020 234.55
1500 60 245.51
1500 180 243.06
1500 300 241.23
1500 420 239.01
1500 540 235.75
1500 660 234.16
1500 780 233.24
1500 900 232.84
1500 1020 233.76
1620 60 244.49
1620 180 242.21
1620 300 239.28
1620 420 236.02
1620 540 233.76
1620 660 232.98
1620 780 231.81
1620 900 232.98
1620 1020 234.16
1740 60 245.94
1740 180 242.92
1740 300 239.42
1740 420 236.29
1740 540 234.03
1740 660 232.58
1740 780 230.52
1740 900 230.14
1740 1020 234.69
1860 60 252.83
1860 180 249.19
1860 300 244.35
1860 420 240.53
1860 540 236.96
1860 660 237.37
1860 780 235.22
1860 900 235.48
1860 1020 236.56
'''
Dimension = 3.0
inSmoothingFactor = 1.0
XOrder = 4
YOrder = 4
#bbox = [0,768,0,480]
bbox = [0,1920,0,1080]
数据转换:
rawData = StringIO.StringIO(asciiDataInColumns_3D).readlines()
dataLists = [[], [], []]
for line in rawData:
tokenlist = line.split()
if len(tokenlist) < Dimension:
continue
try:
a = float(tokenlist[0])
b = float(tokenlist[1])
c = float(tokenlist[2])
except:
continue
if a > 1.0E300 or a < -1.0E300:
continue
if b > 1.0E300 or b < -1.0E300:
continue
if c > 1.0E300 or c < -1.0E300:
continue
dataLists[0].append(a)
dataLists[1].append(b)
dataLists[2].append(c)
arrayLists = numpy.array(dataLists)
scipy样条曲线:
mSpline = scipy.interpolate.fitpack2.SmoothBivariateSpline(IndependentData[0], IndependentData[1], DependentData, s=inSmoothingFactor, kx=XOrder, ky=YOrder, bbox=bbox)
tx = mSpline.tck[0]
ty = mSpline.tck[1]
coeff = mSpline.tck[2]
公式:
def mfitting(x_in, y_in):
global tx, ty, coeff
nx = len(tx)
ny = len(ty)
kx = 4
ky = 4
h = [0.0] * 25
hh = [0.0] * 25
w_x = [0.0] * 25
w_y = [0.0] * 25
kx1 = kx+1
nkx1 = nx-kx1
l = kx1
l1 = l+1
while x_in >= tx[l1-1] and l != nkx1:
l = l1
l1 = l+1
h[0] = 1.0
for j in range(1, kx+1):
for i in range(j):
hh[i] = h[i]
h[0] = 0.0
for i in range(j):
li = l+i
lj = li-j
if tx[li] != tx[lj]:
f = hh[i] / (tx[li] - tx[lj])
h[i] = h[i] + f * (tx[li] - x_in)
h[i+1] = f * (x_in - tx[lj])
else:
h[i+1-1] = 0.0
lx = l-kx1
for j in range(kx1):
w_x[j] = h[j]
ky1 = ky+1
nky1 = ny-ky1
l = ky1
l1 = l+1
while y_in >= ty[l1-1] and l != nky1:
l = l1
l1 = l+1
h[0] = 1.0
for j in range(1, ky+1):
for i in range(j):
hh[i] = h[i]
h[0] = 0.0
for i in range(j):
li = l+i
lj = li-j
if ty[li] != ty[lj]:
f = hh[i] / (ty[li] - ty[lj])
h[i] = h[i] + f * (ty[li] - y_in)
h[i+1] = f * (y_in - ty[lj])
else:
h[i+1-1] = 0.0
ly = l-ky1
for j in range(ky1):
w_y[j] = h[j]
l = lx*nky1
for i1 in range(kx1):
h[i1] = w_x[i1]
l1 = l+ly
temp = 0.0
for i1 in range(kx1):
l2 = l1
for j1 in range(ky1):
l2 = l2+1
temp = temp + coeff[l2-1] * h[i1] * w_y[j1]
l1 = l1+nky1
return temp
主要内容:
好吧,这是一堵代码墙,我不会尝试运行它。你说结果变得“不顺利”——你说的确切意思是什么?您是否绘制了实际数据并将其与样条曲线拟合进行了比较?此外,是否有理由将kx和ky设置为4,而不是默认值3?为什么不直接调用scipy.interpolate.SmoothBivariateSpline?你试过没有平滑的吗?如果有疑问,请返回默认设置。此外,SmoothBivariateSpline提供了使用.ev(x,y)方法计算网格(基础对象)或点上样条曲线的函数。感谢您的回答。关于“不平滑”,我画了一个图表来描述,我绘制的实际数据误差仅为采样点的1/255,我将尝试order=3和.ev(x,y)。再次感谢你
def mfitting(x_in, y_in):
global tx, ty, coeff
nx = len(tx)
ny = len(ty)
kx = 4
ky = 4
h = [0.0] * 25
hh = [0.0] * 25
w_x = [0.0] * 25
w_y = [0.0] * 25
kx1 = kx+1
nkx1 = nx-kx1
l = kx1
l1 = l+1
while x_in >= tx[l1-1] and l != nkx1:
l = l1
l1 = l+1
h[0] = 1.0
for j in range(1, kx+1):
for i in range(j):
hh[i] = h[i]
h[0] = 0.0
for i in range(j):
li = l+i
lj = li-j
if tx[li] != tx[lj]:
f = hh[i] / (tx[li] - tx[lj])
h[i] = h[i] + f * (tx[li] - x_in)
h[i+1] = f * (x_in - tx[lj])
else:
h[i+1-1] = 0.0
lx = l-kx1
for j in range(kx1):
w_x[j] = h[j]
ky1 = ky+1
nky1 = ny-ky1
l = ky1
l1 = l+1
while y_in >= ty[l1-1] and l != nky1:
l = l1
l1 = l+1
h[0] = 1.0
for j in range(1, ky+1):
for i in range(j):
hh[i] = h[i]
h[0] = 0.0
for i in range(j):
li = l+i
lj = li-j
if ty[li] != ty[lj]:
f = hh[i] / (ty[li] - ty[lj])
h[i] = h[i] + f * (ty[li] - y_in)
h[i+1] = f * (y_in - ty[lj])
else:
h[i+1-1] = 0.0
ly = l-ky1
for j in range(ky1):
w_y[j] = h[j]
l = lx*nky1
for i1 in range(kx1):
h[i1] = w_x[i1]
l1 = l+ly
temp = 0.0
for i1 in range(kx1):
l2 = l1
for j1 in range(ky1):
l2 = l2+1
temp = temp + coeff[l2-1] * h[i1] * w_y[j1]
l1 = l1+nky1
return temp
print "Creating MASK ...."
#im_RGB = Image.new('RGB',(768,480))
im_RGB = Image.new('RGB',(1920,1080))
'''
for i in range(768):
for j in range(480):
value = int(Spline_model(i,j))
im_RGB.putpixel((i,j), (value,value,value))
'''
for i in range(1920):
for j in range(1080):
value = int(mfitting(i,j))
im_RGB.putpixel((i,j), (value,value,value))
im_RGB.save("MASK.png")
print "Creating MASK Done"