Как нарисовать текстурированный треугольник в MATLAB? - PullRequest
4 голосов
/ 16 февраля 2010

У меня есть треугольник в (u,v) координатах на изображении. Я хотел бы нарисовать этот треугольник в трехмерных координатах (X,Y,Z) с текстурой, сопоставленной треугольнику на изображении.

Здесь u,v,X,Y,Z - все векторы с тремя элементами, представляющими три угла треугольника.

У меня есть очень уродливое, медленное и неудовлетворительное решение, в котором я:

  1. извлечь прямоугольную часть изображения
  2. преобразовать его в трехмерное пространство с преобразованием, определенным тремя точками
  3. Нарисуй его с поверхности
  4. наконец-то маскируем все, что не является частью треугольника, с помощью AlphaData

Неужели должен быть более простой способ сделать это?

Ответы [ 2 ]

13 голосов
/ 26 марта 2010

У меня есть то, что я считаю лучшим решением для вас, включающее два шага. Во-первых, он извлекает прямоугольную часть вашего изображения, половина которой представляет собой треугольную секцию, которая будет использоваться в качестве карты текстуры, а половина будет игнорироваться. Затем эта карта текстуры применяется к трехмерному объекту поверхности, точки которого откорректированы, чтобы отобразить его в виде треугольника, а не четырехугольника.

Для примера, который я покажу здесь, я буду использовать следующие значения для ваших различных параметров, предполагая, что у вас есть треугольник, точки которого помечены как «начало» (вершина треугольника), точка «A» и точка «B». "в пространстве изображения (как на первом изображении ниже):

x = [0.1 0.9 0.8];   % [xorigin xA xB] coordinates in 3-D space
y = [0.9 0.1 0.8];   % [yorigin yA yB] coordinates in 3-D space
z = [0.1 0.1 0.9];   % [zorigin zA zB] coordinates in 3-D space
origin = [150 350];  % Vertex of triangle in image space
U = [300 -50];       % Vector from origin to point A in image space
V = [50 -250];       % Vector from origin to point B in image space
img = imread('peppers.png');  % Sample image for texture map


Извлечение карты текстуры с помощью проективного преобразования:

На этом шаге используются Инструменты обработки изображений Функции maketform и imtransform для выполнения проективного преобразования части изображения, содержащей треугольник Вы хотите использовать в качестве карты текстуры. Обратите внимание, что поскольку изображения должны быть прямоугольными, необходимо включить дополнительный треугольный участок, определенный точками (O,B,C).

enter image description here

Треугольная часть нужного вам изображения будет находиться в нижней правой половине изображения, а дополнительная треугольная часть «заполнитель» будет в левом верхнем углу. Обратите внимание, что этот дополнительный треугольник может выходить за пределы изображения, что приведет к тому, что его часть будет по умолчанию заполнена черным. Вот код для выполнения проективного преобразования, показанный выше:

A = origin+U;  % Point A
B = origin+V;  % Point B
C = B-U;       % Point C
[nRows, nCols, nPages] = size(img);  % Image dimensions
inputCorners = [origin; ...          % Corner coordinates of input space
                A; ...
                B; ...
                C];
outputCorners = [1 nRows; ...        % Corner coordinates of output space
                 nCols nRows; ...
                 nCols 1; ...
                 1 1];
tform = maketform('projective', ...  % Make the transformation structure
                  inputCorners, ...
                  outputCorners);
triTexture = imtransform(img,tform, 'bicubic', ...  % Transform the image
                         'xdata', [1 nCols], ...
                         'ydata', [1 nRows], ...
                         'size', [nRows nCols]);

Обратите внимание, что этот код создаст окончательное изображение triTexture того же размера, что и входное изображение img.


Построение треугольной текстурной поверхности:

Построение поверхности теперь довольно просто, если вы упорядочили значения в переменных x,y,z так, чтобы координаты исходной точки были в первых индексах, координаты точки A - во вторых индексах, и координаты точки B находятся в третьих индексах. Теперь вы можете создавать новые наборы координат поверхности 2 на 2 X,Y,Z, которые содержат две копии точки B, что приводит к визуализации только половины поверхности (то есть половины, содержащей желаемое треугольное изображение в качестве карты текстуры). Вот код для этого:

index = [3 3; 1 2];  % Index used to create 2-by-2 surface coordinates
X = x(index);        % x coordinates of surface
Y = y(index);        % y coordinates of surface
Z = z(index);        % z coordinates of surface
hSurface = surf(X, Y, Z, triTexture, ...  % Plot texture-mapped surface
                'FaceColor', 'texturemap', ...
                'EdgeColor', 'none');
axis equal            % Use equal scaling on axes
axis([0 1 0 1 0 1]);  % Set axes limits
xlabel('x-axis');     % x-axis label
ylabel('y-axis');     % y-axis label
zlabel('z-axis');     % z-axis label

И вот полученная в результате текстурированная треугольная поверхность, которую она создает, с добавленной вставкой, чтобы показать, что карта текстуры содержит правильную треугольную часть исходного изображения:

enter image description here

0 голосов
/ 16 февраля 2010
...