Подтвердить что ты не робот

Отображение текстур в MATLAB

У меня есть точки в трехмерном пространстве и их соответствующие точки 2D-изображения. Как я могу сделать сетку из трехмерных точек, а затем текстурировать грани треугольника, образованные сеткой?

4b9b3361

Ответ 1

Обратите внимание, что функция trisurf, которую вы изначально пытались использовать, возвращает дескриптор объекта патча. Если вы посмотрите на свойство 'FaceColor' для объектов патча, вы увидите, что нет опции 'texturemap'. Этот параметр действителен только для свойства 'FaceColor' свойств поверхностных объектов. Поэтому вам придется найти способ построить свою треугольную поверхность как поверхностный объект вместо объекта патча. Вот два способа приблизиться к этому:

Если ваши данные находятся в единой сетке...

Если координаты ваших поверхностных данных представляют собой однородную сетку, так что z представляет собой прямоугольное множество точек, которые простираются от xmin до xmax по оси x и от ymin до ymax в y-axis, вы можете построить его с помощью surf вместо trisurf:

Z = ...  % N-by-M matrix of data
x = linspace(xmin, xmax, size(Z, 2));  % x-coordinates for columns of Z
y = linspace(ymin, ymax, size(Z, 1));  % y-coordinates for rows of Z
[X, Y] = meshgrid(x, y);               % Create meshes for x and y
C = imread('image1.jpg');              % Load RGB image
h = surf(X, Y, Z, flipdim(C, 1), ...   % Plot surface (flips rows of C, if needed)
         'FaceColor', 'texturemap', ...
         'EdgeColor', 'none');
axis equal

Чтобы проиллюстрировать результаты приведенного выше кода, я инициализировал данные как Z = peaks;, использовал встроенное образцовое изображение 'peppers.png' и установил значения x и y в диапазоне от 1 до 16. Это привело к следующей текстурированной поверхности:

введите описание изображения здесь

Если ваши данные неравномерно распределены...

Если ваши данные не расположены на регулярной основе, вы можете создать набор регулярных интервалов x и y (как я сделал выше, используя meshgrid), а затем используйте одну из функций griddata или TriScatteredInterp, чтобы интерполировать правильную сетку значений z из вашего нерегулярного набора значений z. Я обсуждаю, как использовать эти две функции в моем ответе на другой вопрос SO. Здесь уточненная версия кода, который вы опубликовали с помощью TriScatteredInterp (Примечание: по R2013a scatteredInterpolant является рекомендуемой альтернативой):

x = ...  % Scattered x data
y = ...  % Scattered y data
z = ...  % Scattered z data
xmin = min(x);
xmax = max(x);
ymin = min(y);
ymax = max(y);
F = TriScatteredInterp(x(:), y(:), z(:));  % Create interpolant
N = 50;  % Number of y values in uniform grid
M = 50;  % Number of x values in uniform grid
xu = linspace(xmin, xmax, M);         % Uniform x-coordinates
yu = linspace(ymin, ymax, N);         % Uniform y-coordinates
[X, Y] = meshgrid(xu, yu);            % Create meshes for xu and yu
Z = F(X, Y);                          % Evaluate interpolant (N-by-M matrix)
C = imread('image1.jpg');             % Load RGB image
h = surf(X, Y, Z, flipdim(C, 1), ...  % Plot surface
         'FaceColor', 'texturemap', ...
         'EdgeColor', 'none');
axis equal

В этом случае вы должны сначала выбрать значения N и M для размера вашей матрицы z. Чтобы проиллюстрировать результаты приведенного выше кода, я инициализировал данные для x, y и z следующим образом и использовал встроенное образцовое изображение 'peppers.png':

x = rand(1, 100)-0.5;  % 100 random values in the range -0.5 to 0.5
y = rand(1, 100)-0.5;  % 100 random values in the range -0.5 to 0.5
z = exp(-(x.^2+y.^2)./0.125);  % Values from a 2-D Gaussian distribution

В результате появилась следующая текстурированная поверхность:

введите описание изображения здесь

Обратите внимание, что рядом с углами поверхности имеются зубчатые ребра. Это места, где для TriScatteredInterp было слишком мало точек для адекватной установки интерполированной поверхности. Значения z в этих точках, следовательно, nan, в результате чего поверхность не отображается на графике.

Ответ 2

Если ваша текстура уже находится в правильной геометрии, вы можете просто использовать обычное старое отображение текстуры.

Ссылка на документацию MathWorks по составлению текстур: http://www.mathworks.com/access/helpdesk/help/techdoc/visualize/f0-18164.html#f0-9250

Re-EDIT: немного обновите код:

Попробуйте этот подход (я просто получил его для работы).

 a=imread('image.jpg');
 b=double(a)/255;

 [x,y,z]=peaks(30);  %# This is a surface maker that you do have
                     %# The matrix [x,y,z] is the representation of the surface.

 surf(x,y,z,b,'FaceColor','texturemap')  %# Try this with any image and you 
                                         %# should see a pretty explanatory 
                                         %# result. (Just copy and paste) ;)

Итак, [x, y, z] - "поверхность", а точнее матрица, содержащая несколько точек в виде (x, y, z), которые находятся на поверхности. Обратите внимание, что изображение растягивается, чтобы соответствовать поверхности.