이미지의 affine 변형을 계산. 입력 프레임 img 내에서 p파라메터에 있는 affine계수에 따라 일정 부분을 취해 sz(예를 들면, 32x32)크기의 영상으로 만들어 리턴. p 행렬 내에 복수개의 affine 계수가 넘어가면 복수 개의 sz 크기 영상들이 생성되어 리턴.
function wimg = warpimg(img, p, sz)
% function wimg = warpimg(img, p, sz)
%
% img(h,w) : 입력 프레임
% p(6,n) : Affine 인자 행렬(n은 affine 인자 set의 갯수)
% sz(th,tw) : 입력 영상 내에서 취할 template 크기
%
% 이미지의 affine변형을 고속으로 처리하기 위한 함수
%% Copyright (C) 2005 Jongwoo Lim and David Ross.
%% All rights reserved.
if (nargin < 3)
sz = size(img);
end
if (size(p,1) == 1) % size(param0,1)=1
p = p(:); % param0는 행벡터인데 열벡터로 만들어 줌
end
w = sz(2); % 32
h = sz(1); % 32
n = size(p,2); % size(p,2)=1
[x,y] = meshgrid([1:w]-w/2, [1:h]-h/2);
% x=[ -15 ... 16;
% -15 ... 16;
% ...
% -15 ... 16], size(x)=32x32
% y=[ -15 .... -15;
% -14 ... -14;
% ...
% 16 ... 16]; size(y)=32x32
pos = reshape(cat(2, ones(h*w,1),x(:),y(:)) ...
* [p(1,:) p(2,:); p(3:4,:) p(5:6,:)], [h,w,n,2]);
% size(ones(h*w,1))=1024, size(x(:))=1024
% CAT Concatenate arrays.
% CAT(DIM,A,B) concatenates the arrays A and B along
% the dimension DIM.
% CAT(2,A,B) is the same as [A,B].
% CAT(1,A,B) is the same as [A;B].
% cat(2, ones(h*w,1),x(:),y(:)) =
% [ 1 -15 -15; 1 -15 -14; 1 -15 -14; ...; 1 16 15; 1 16 16]: 1024x3
% [p(1,:) p(2,:); p(3:4,:) p(5:6,:)]
% 177.0000 147.0000
% 0.1166 -0.6368
% -0.6368 3.4771
% p1=cat(2, ones(h*w,1),x(:),y(:))*[p(1,:) p(2,:); p(3:4,:) p(5:6,:)]
% size(p1)=1024x2
% size(pos)=32x32x1x2
%
% (Example) For one pixel and one set of affine params:
% (1 x y).(tx ty; a11 a21; a12 a22)=(tx+a11.x+a12.y ty+a21.x+a22.y)
% For all pixels in sz (32x32=1024 pixels) and one set of affine parameters:
% [1 x1 y1; 1 x2 y2; ....].[tx ty; a11 a21; a12 a22]
% = [tx+a11.x+a12.y ty+a21.x+a22.y; tx+a11.x+a12.y ty+a21.x+a22.y; ...]
% *size: (1024x3).(3x2) = (1024x2)
% For all pixels & n sets of affine parameters:
% [1 x1 y1; 1 x2 y2; ....].[tx(1) tx(2) ... tx(n) ty(1) ty(2) ... ty(n);
% a11(1) a11(2) ...a11(n) a21(1) a21(2) ...a21(n);
% a12(1) a12(2) ...a12(n) a22(1) a22(2) ...a22(n)];
% * size: (1024x3).(3xnx2)=(1024xnx2) --> (32x32xnx2)
wimg = squeeze(interp2(img, pos(:,:,:,1), pos(:,:,:,2)));
% size(wimg)=32x32
% interp2(z,x1,y1): bilinear interpolation for the values of the
% underlying 2-D function z at points in matrices x1 and y1.
%%pos(:,:,:,1) : x麟깃앤黎
%%pos(:,:,:,2) : y麟깃앤黎
wimg(find(isnan(wimg))) = 0; %%nan인 값을 찾아 0으로 만들어 줌
%ISNAN True for Not-a-Number.
% ISNAN(X) returns an array that contains 1's where
% the elements of X are NaN's and 0's where they are not.
% For example, ISNAN([pi NaN Inf -Inf]) is [0 1 0 0].
% B = SQUEEZE(A) returns an array B with the same elements as
% A but with all the singleton dimensions removed. A singleton
% is a dimension such that size(A,dim)==1;
댓글 없음:
댓글 쓰기