如何绘制表面纹理贴图(How to plot a surface with a texture ma

2019-09-01 18:25发布

我要绘制一个表面上有一个纹理贴图,但条件是不是“理想”的人。

首先让解释我有。

我有一组是图像坐标,在网格点(〜7000)的。 这点不定义完美的正方形。 这不是一个MESHGRID。 对于这个问题的缘故,让我们假设我们有9分。 让ilustrate我们有一个形象:

 X=[310,270,330,430,410,400,480,500,520]
 Y=[300,400,500,300,400,500,300,400,500]

比方说,我们可以得到电网的“结构”,所以

 size1=3;
 size2=3;
 points=zeros(size1,size2,2)
 X=[310,270,330;
    430,410,400;
    480,500,520]
 Y=[300,400,500;
    300,400,500;
    300,400,500]
 points(:,:,1)=X;
 points(:,:,2)=Y;

现在可以说,我们有一个第三维,Z.

编辑:忘了,如果信息添加一块。 我三角测量图像中的点,并得到一个3D对应,所以在表面上显示时,他们不具备X和图像Y的COORDS,对于给定的数据的简化可以说,X = X / 2 Y = Y / 3

我们有:

 points=zeros(size1,size2,3)
 Z=[300,330,340;
    300,310,330;
    290,300,300]

 surf(points(:,:,1)/2,points(:,:,2)/3,points(:,:,3))

我要的是在表面与图像纹理绘制3D的。 各元件应具有有第一图像的纹理块。

这需要巨额数据表工作。 我并不特别需要它要快。

相关帖子(但I具有meshgrid作为初始点的集合): 对于2D网格纹理贴图

PD:我可以张贴的原始图像+如果需要真实的数据,刚刚发布了这一点,因为我认为这是对小数据更容易。

Answer 1:

我不认为你可以做你想做与Matlab的内置命令和功能是什么。 但是,使用该技术从我的其他答案用高清晰度的版本电网能为你做到这一点。

“高清晰度”,我的意思是,非均匀网格的插值版本具有更密集的数据点。 是,用于在更高密度的数据点来采样纹理,因此它可以使用绘制texturemap的特征surf 。 不能使用普通的2D插值,但是,因为你需要保留的非均匀网格的形状。 这是我想出了:

function g = nonUniformGridInterp2(g, sx, sy)

[a,b] = size(g);
g = interp1(linspace(0,1,a), g, linspace(0,1,sy)); % interp columns
g = interp1(linspace(0,1,b), g', linspace(0,1,sx))'; % interp rows

请注意,您必须调用两次这个独立插X和Y点。 这里的原始网格,在每个方向10个点的内插的版本的示例。

以下是如何使用高分辨率网格interp2texturemap

function nonUniformTextureMap

% define the non-uniform surface grid
X = [310,270,330; 430,410,400; 480,500,520];
Y = [300,400,500; 300,400,500; 300,400,500];
Z = [300,330,340; 300,310,330; 290,300,300];

% get texture data
load penny % loads data in variable P

% define texture grid based on image size
% note: using 250-550 so that a,b covers the range used by X,Y
[m,n] = size(P);
[a,b] = meshgrid(linspace(250,550,n), linspace(250,550,m));

% get a high-res version of the non-uniform grid
s = 200; % number of samples in each direction
X2 = nonUniformGridInterp2(X, s, s);
Y2 = nonUniformGridInterp2(Y, s, s);

% sample (map) the texture on the non-uniform grid
C = interp2(a, b, P, X2, Y2);

% plot the original and high-res grid
figure
plot(X(:),Y(:),'o',X2(:),Y2(:),'.')
legend('original','high-res')

% plot the surface using sampled points for color
figure
surf(X, Y, Z, C, 'edgecolor', 'none', 'FaceColor','texturemap')
colormap gray



Answer 2:

您可以使用texturemap财产surf与矩形网格以及与非矩形的那些作品。

创建非矩形数据点

% creating non-rectangular data points
[X, Y] = meshgrid(1:100, 1:100);
X = X+rand(size(X))*5; 
Y = Y+rand(size(X))*5; 

这导致以下的数据点:

生成高度数据:

Z = sin(X/max(X(:))*2*pi).*sin(Y/max(Y(:))*2*pi);

加载图片:

[imageTest]=imread('peppers.png');

和映射它作为纹理到网状:

surf(X,Y,Z, imageTest, ...
     'edgecolor', 'none','FaceColor','texturemap')

需要注意的是,对于示范的缘故,这种非矩形网格是相当人烟稀少,这导致相当参差不齐的质感。 随着越来越多的点,结果变得更好,无论网格点的失真。

还要注意的网格点的数量并没有相匹配的纹理图像中的像素数。

〜编辑〜

如果X和Y坐标是只可用于图像的部分,可以通过相应的调整纹理

minX = round(min(X(:)));
maxX = round(max(X(:))); 
minY = round(min(Y(:)));
maxY = round(max(Y(:)));

surf(X,Y,Z, imageTest(minX:maxX, minY:maxY, :), ...
     'edgecolor', 'none','FaceColor','texturemap')


Answer 3:

我不知道我理解你的问题,但我认为你需要做的是什么样(图)纹理在网格的X,Y点。 然后,你可以简单地绘制表面,并利用这些样本的颜色。

下面是使用你在你的问题给出了数据的例子。 它看起来并不像很多,但使用更多的X,Y,Z点应该给你之后的结果。

% define the non-uniform surface grid
X = [310,270,330; 430,410,400; 480,500,520];
Y = [300,400,500; 300,400,500; 300,400,500];
Z = [300,330,340; 300,310,330; 290,300,300];

% get texture data
load penny % loads data in variable P

% define texture grid based on image size
% note: using 600 so that a,b covers the range used by X,Y
[m,n] = size(P);
[a,b] = meshgrid(linspace(0,600,n), linspace(0,600,m));

% sample (map) the texture on the non-uniform grid
C = interp2(a, b, P, X, Y);

% plot the surface using sampled points for color
figure
surf(X, Y, Z, C)
colormap gray



文章来源: How to plot a surface with a texture map