2D网格的纹理贴图

ola*_*ndo 4 matlab texture-mapping

[x,y]=meshgrid(1:N,1:M)在常规2D N x M网格上定义了一组点.我有另一组点[u,v]是原始网格的一些变形,即[u,v]=f(x,y)'(但是我没有实际f导致变形的点).如何将纹理映射到由" u,v?"定义的"变形"网格?即,如果给出具有宽高比的图像,N/M我该如何将其映射到变形网格?

sho*_*zer 6

我想你要求获得原始纹理的样本[u,v].你可以使用interp2.

假设纹理样本在z,你想要新的样本z2.要在原型中插入原始纹理[u,v],请使用:

z2 = interp2(x,y,z,u,v);
Run Code Online (Sandbox Code Playgroud)

另一方面,如果要将"变形"纹理映射回规则间隔的网格[x2,y2],请使用griddata:

[x2,y2] = meshgrid(1:N2,1:M2);
z2 = griddata(u,v,z,x2,y2);
Run Code Online (Sandbox Code Playgroud)

更新:

下面是一些示例代码,展示了如何使用实际数据执行此操作.使用标准化坐标可以更轻松.

% get texture data
load penny
z = P;

% define original grid based on image size
[m,n] = size(z);
[a,b] = meshgrid(linspace(0,1,n), linspace(0,1,m));

% define new, differently sized grid
m2 = 256;
n2 = 256;
[x,y] = meshgrid(linspace(0,1,n2), linspace(0,1,m2));

% define deformed grid
u = sqrt(x);
v = y.^2;

% sample the texture on the deformed grid
z2 = interp2(a,b,z,u,v);

% plot original and deformed texture
figure
subplot(2,1,1)
surface(a,b,z,'EdgeColor','none')
axis ij image off
colormap gray
title('original')
subplot(2,1,2)
surface(x,y,z2,'EdgeColor','none')
axis ij image off
colormap gray
title('deformed')
Run Code Online (Sandbox Code Playgroud)

这就是结果:

原始和变形纹理的情节