[x,y]=meshgrid(1:N,1:M)
通常の 2DN x M
グリッドで定義された点のセットがあります。[u,v]
元のグリッドの変形である別のポイントのセットがあり[u,v]=f(x,y)'
ます(ただし、変形の原因となった実際のものはありませんf
)。によって定義された「変形した」グリッドにテクスチャをマップするにはどうすればよいu,v
ですか? つまり、アスペクト比のある画像が与えられたN/M
場合、それを変形したグリッドにマップするにはどうすればよいですか?
4 に答える
で元のテクスチャのサンプルを取得するよう求めていると思います[u,v]
。interp2を使用できます。
テクスチャ サンプルが入っていて、z
新しいサンプルが必要だとしましょうz2
。で元のテクスチャを補間するには[u,v]
、次を使用します。
z2 = interp2(x,y,z,u,v);
一方、「変形した」テクスチャを等間隔の grid にマップし直したい場合は、griddata[x2,y2]
を使用します。
[x2,y2] = meshgrid(1:N2,1:M2);
z2 = griddata(u,v,z,x2,y2);
アップデート:
実際のデータでこれを行う方法を示すコード例を次に示します。正規化された座標を使用すると、簡単になります。
% get texture data
load penny
z = P;
% define original grid based on image size
[m,n] = size(z);
[a,b] = meshgrid(linspace(0,1,n), linspace(0,1,m));
% define new, differently sized grid
m2 = 256;
n2 = 256;
[x,y] = meshgrid(linspace(0,1,n2), linspace(0,1,m2));
% define deformed grid
u = sqrt(x);
v = y.^2;
% sample the texture on the deformed grid
z2 = interp2(a,b,z,u,v);
% plot original and deformed texture
figure
subplot(2,1,1)
surface(a,b,z,'EdgeColor','none')
axis ij image off
colormap gray
title('original')
subplot(2,1,2)
surface(x,y,z2,'EdgeColor','none')
axis ij image off
colormap gray
title('deformed')
そして、これは結果です:
編集:
サーフェス関数を使用したテクスチャ マッピングの例を次に示します。
%# image and 2D grid of points of the same size as the image
img = load('clown'); %# indexed color image
[m,n] = size(img.X);
[a,b] = meshgrid(1:n,1:m);
%# initial grid (here 1/5-th the size, but could be anything)
[X,Y] = meshgrid(linspace(1,n,n/5),linspace(1,m,m/5));
%# resize image to fit this grid
[C,map] = imresize(img.X, img.map, size(X), 'bicubic');
%# deformed 2D points (we dont need to know f, just load U/V here)
fx = @(x,y) sqrt(x);
fy = @(x,y) y.^2;
U = fx(X,Y);
V = fy(X,Y);
%# Z-coordinates: I'm using Z=0 for all points, but could be anything
Z = zeros(size(U));
%Z = peaks(max(size(U))); Z = Z(1:size(U,1),1:size(U,2)); view(3)
%# show image as texture-mapped surface
surface(U, V, Z, C, 'CDataMapping','direct', ...
'FaceColor','texturemap', 'EdgeColor','none')
colormap(map)
axis ij tight off
view(2)
使用する代わりに、imresize
明示的な補間があります (アイデアは @shoelzer から借用):
CC = ind2rgb(img.X, img.map); %# convert to full truecolor
C = zeros(size(X));
for i=1:size(CC,3)
C(:,:,i) = griddata(a,b, CC(:,:,i), X,Y, 'linear');
end
もちろん、この変更により、カラーマップ/CDataMapping はもう必要ありません...
interp2
(注:ここでははるかに高速になると思います)
上記の例では、カラーマップが関連付けられたインデックス付きカラー イメージを使用していることに注意してください。このコードは、グレースケールまたはトゥルーカラーのフル RGB 画像で動作するように簡単に適応させることができます。さまざまな画像タイプの説明については、このページを参照してください。
x
、y
、u
およびv
が同じサイズ ( MxN
2D マトリックス) であり、マップするイメージ/テクスチャI
のサイズが (3 つのカラー チャネル) であると仮定すると、役立つMxNx3
場合があります。scatter
figure;
scatter( u(:), v(:), 30, reshape( I, [], 3 ), 's', 'filled' );