У меня есть то, что я считаю лучшим решением для вас, включающее два шага. Во-первых, он извлекает прямоугольную часть вашего изображения, половина которой представляет собой треугольную секцию, которая будет использоваться в качестве карты текстуры, а половина будет игнорироваться. Затем эта карта текстуры применяется к трехмерному объекту поверхности, точки которого откорректированы, чтобы отобразить его в виде треугольника, а не четырехугольника.
Для примера, который я покажу здесь, я буду использовать следующие значения для ваших различных параметров, предполагая, что у вас есть треугольник, точки которого помечены как «начало» (вершина треугольника), точка «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)
.
Треугольная часть нужного вам изображения будет находиться в нижней правой половине изображения, а дополнительная треугольная часть «заполнитель» будет в левом верхнем углу. Обратите внимание, что этот дополнительный треугольник может выходить за пределы изображения, что приведет к тому, что его часть будет по умолчанию заполнена черным. Вот код для выполнения проективного преобразования, показанный выше:
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
И вот полученная в результате текстурированная треугольная поверхность, которую она создает, с добавленной вставкой, чтобы показать, что карта текстуры содержит правильную треугольную часть исходного изображения: