我试图用b样条曲面近似一幅图像.风水库有一个名为"approximate_surface“的函数来实现这个功能。当我将它与一个平滑的函数(如f(x)=x^2 )生成的图像一起使用时,事情会像预期的那样工作。但是当我使用我的实际图像时,控制点似乎到处都是。B样条曲面与输入曲面完全不一样.为什么会这样呢?
我用一个小图像做了一个例子:
img = np.array([
[ 0. , 0. , 590.2 , 0. , 0. , 0. ],
[ 0. , 1115.8 , 1704. , 1724.2 , 0. , 0. ],
[ 0. , 1390.6 , 1810. , 1877.8 ,1309.4 , 0. ],
[ 0. , 1274. , 1735. , 1720. ,1249.8 , 0. ],
[ 0. , 1000. , 1345. , 1345. ,1168. , 348.2],
[ 0. , 734. , 970. ,1105. ,895.8 , 0. ],
[ 0. , 627. , 805. , 928.8 , 0. , 0. ],
[ 0. , 394. , 635.2 , 627.2 , 0. , 0. ]])
plt.imshow(img)
plt.show()

pts = []
h, w = img.shape
for i in range(h):
for j in range(w):
pts.append((float(i), float(j), float(img[i,j])))
surf = fitting.approximate_surface(pts,size_u=h,size_v=w,degree_u=1, degree_v=1)
ctrlpts = np.array(surf.ctrlpts)
print(ctrlpts[0:10])我得到了输出
[[ 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 -3.97922748e-01 -5.32705554e+02]
[ 0.00000000e+00 2.72312015e+00 1.09167840e+03]
[ 0.00000000e+00 4.07453113e+00 -3.98262686e+02]
[ 0.00000000e+00 5.00000000e+00 0.00000000e+00]
[ 5.97819029e+00 0.00000000e+00 0.00000000e+00]
[ 5.97819029e+00 -3.97922748e-01 -1.16343388e+04]
[ 5.97819029e+00 2.72312015e+00 1.93970077e+04]
[ 5.97819029e+00 4.07453113e+00 -2.33379745e+04]
[ 5.97819029e+00 5.00000000e+00 2.91199984e+03]]策划:
vis_obj = vis.VisSurface(vis.VisConfig())
surf.vis = vis_obj
surf.render()

您可以在colab中试用代码这里。
编辑:
最后,我使用了does "scipy.interpolate.bisplrep“,这确实和我预期的一样。
geomdl的维护人员似乎对当前开放的github问题没有反应。因此,如果你有同样的问题,我的建议是使用枕木功能。
发布于 2022-07-27 14:40:30
我认为表面工作正常,但观众并没有明显地缩放。我刚刚重新运行了这段代码,将z方向缩放到1000倍,这看起来是明智的。
import numpy as np
from geomdl import fitting
from geomdl.visualization import VisMPL as vis
img = np.array([
[ 0. , 0. , 590.2 , 0. , 0. , 0. ],
[ 0. , 1115.8 , 1704. , 1724.2 , 0. , 0. ],
[ 0. , 1390.6 , 1810. , 1877.8 ,1309.4 , 0. ],
[ 0. , 1274. , 1735. , 1720. ,1249.8 , 0. ],
[ 0. , 1000. , 1345. , 1345. ,1168. , 348.2],
[ 0. , 734. , 970. ,1105. ,895.8 , 0. ],
[ 0. , 627. , 805. , 928.8 , 0. , 0. ],
[ 0. , 394. , 635.2 , 627.2 , 0. , 0. ]])
pts = []
h, w = img.shape
for i in range(h):
for j in range(w):
pts.append((float(i), float(j), float(img[i,j] / 1000)))
surf = fitting.approximate_surface(pts,size_u=h,size_v=w,degree_u=1, degree_v=1)
vis_obj = vis.VisSurface()
surf.vis = vis_obj
surf.render()生产:

https://stackoverflow.com/questions/70813285
复制相似问题