首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >风水approximate_surface未按预期工作

风水approximate_surface未按预期工作
EN

Stack Overflow用户
提问于 2022-01-22 13:26:25
回答 1查看 167关注 0票数 2

我试图用b样条曲面近似一幅图像.风水库有一个名为"approximate_surface“的函数来实现这个功能。当我将它与一个平滑的函数(如f(x)=x^2 )生成的图像一起使用时,事情会像预期的那样工作。但是当我使用我的实际图像时,控制点似乎到处都是。B样条曲面与输入曲面完全不一样.为什么会这样呢?

我用一个小图像做了一个例子:

代码语言:javascript
复制
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()

代码语言:javascript
复制
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])

我得到了输出

代码语言:javascript
复制
[[ 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]]

策划:

代码语言:javascript
复制
vis_obj = vis.VisSurface(vis.VisConfig())
surf.vis = vis_obj
surf.render()

您可以在colab中试用代码这里

编辑:

最后,我使用了does "scipy.interpolate.bisplrep“,这确实和我预期的一样。

geomdl的维护人员似乎对当前开放的github问题没有反应。因此,如果你有同样的问题,我的建议是使用枕木功能。

EN

回答 1

Stack Overflow用户

发布于 2022-07-27 14:40:30

我认为表面工作正常,但观众并没有明显地缩放。我刚刚重新运行了这段代码,将z方向缩放到1000倍,这看起来是明智的。

代码语言:javascript
复制
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()

生产:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70813285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档