matlab - 如何使用纹理贴图绘制表面

标签 matlab image-processing texture-mapping geometry-surface

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

首先让我们解释一下我有什么。

我有一组点 (~7000),它们是网格中的图像坐标。 这个点不定义完美的正方形。 它不是网格。为了这个问题,让我们假设我们有 9 分。让我们用一张图片来说明我们拥有的东西:

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

enter image description here 比方说我们可以获得网格的“结构”,所以

 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;

现在假设我们有第 3 个维度 Z。

编辑: 忘记添加信息。我对图像中的点进行三角测量并获得 3D 对应关系,因此当显示在表面上时,它们没有图像的 X 和 Y 坐标,为了简化给定数据,可以说 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))

enter image description here

我想要的是用图像纹理绘制 3D 表面。每个元素都应该有第一张图片中的纹理。

这需要适用于庞大的数据表。我并不特别需要它快。

相关帖子(但我有一个网格作为初始点集):Texture map for a 2D grid

PD:如果需要,我可以发布原始图像 + 真实数据,只是发布这个因为我认为使用小数据更容易。

最佳答案

您可以使用 surftexturemap 属性,它适用于矩形网格和非矩形网格。

创建非矩形数据点

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

这会产生以下数据点:

enter image description here

生成高度数据:

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

enter image description here

加载图片:

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

enter image description here

并将其作为纹理映射到网格:

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

enter image description here

请注意,为了演示起见,这个非矩形网格的填充非常稀疏,这会导致纹理参差不齐。随着更多的点,结果变得更好,不管网格点的失真如何。

另请注意,网格点的数量不必与纹理图像中的像素数量相匹配。

~编辑~

如果 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')

关于matlab - 如何使用纹理贴图绘制表面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16342164/

相关文章:

performance - Matlab GPU加速用于加载大点云数据集

Matlab图形用户界面: How to return the rows of a table from a histogram bin

java - 如何通过java和matlab控制运行.m(matlab)文件?

image-processing - 模拟 "unfocused"图像

python - 如何使用python将盐和胡椒粉噪声仅应用于图像的特定部分?

c++ - OpenGL mipmap 问题

matlab - 计算两个矩阵中每个行组合之间的距离

python - OpenCV:为 OCR 隔离车牌字符

texture-mapping - 多个网格上的Vulkan纹理渲染

opengl - 使用 OpenGL 4.x 的 1d 纹理进行纹理映射