私はあなたにとって2つのステップを含むより良い解決策だと思うものを持っています。まず、画像の長方形の部分を抽出します。その半分はテクスチャマップとして使用される三角形のセクションであり、半分は無視されます。次に、このテクスチャマップは、四角形ではなく三角形としてレンダリングされるようにポイントが調整された3Dサーフェスオブジェクトに適用されます。
ここで示す例では、ポイントが「原点」(三角形の頂点)、ポイント「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
射影変換によるテクスチャマップの抽出:
このステップでは、Image Processing Toolbox関数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の座標が2番目のインデックスにあり、ポイントBの座標が次のようになるように変数の値を並べ替えたとすると、サーフェスのプロットは非常に簡単になります。3番目のインデックスで。これで、ポイントBの2つのコピーを含む2行2列のサーフェス座標の新しいセットを作成できますX,Y,Z
。これにより、サーフェスの半分のみがレンダリングされます(つまり、半分にテクスチャマップとして目的の三角形のイメージが含まれます)。これを行うためのコードは次のとおりです。
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
これが作成されたテクスチャマッピングされた三角形のサーフェスです。テクスチャマップに元の画像の正しい三角形の部分が含まれていることを示すために挿入図が追加されています。
