From f618466c25d43f3bae9e40920273bf77de1e1149 Mon Sep 17 00:00:00 2001 From: leochanj105 Date: Mon, 19 Oct 2020 23:09:30 -0400 Subject: initial sd-vbs initial sd-vbs add sd-vbs sd-vbs --- SD-VBS/common/toolbox/toolbox_basic/affine/README | 5 + .../common/toolbox/toolbox_basic/affine/carve_it.m | 25 +++++ .../toolbox/toolbox_basic/affine/compute_AD.m | 90 ++++++++++++++++++ .../toolbox/toolbox_basic/affine/compute_AD_disp.m | 103 +++++++++++++++++++++ .../toolbox/toolbox_basic/affine/compute_J.m | 31 +++++++ .../common/toolbox/toolbox_basic/affine/find_AD.m | 82 ++++++++++++++++ .../common/toolbox/toolbox_basic/affine/find_D.m | 65 +++++++++++++ .../toolbox/toolbox_basic/affine/find_center.m | 4 + .../toolbox/toolbox_basic/affine/gen_feature_s.m | 17 ++++ SD-VBS/common/toolbox/toolbox_basic/affine/grad.m | 24 +++++ .../toolbox/toolbox_basic/affine/hemisphere_s.m | 27 ++++++ SD-VBS/common/toolbox/toolbox_basic/affine/im.m | 3 + .../common/toolbox/toolbox_basic/affine/iter_AD.m | 26 ++++++ .../toolbox/toolbox_basic/affine/m_interp4.m | 49 ++++++++++ .../toolbox/toolbox_basic/affine/norm_inten.m | 11 +++ .../common/toolbox/toolbox_basic/affine/pan.0.pgm | 53 +++++++++++ .../common/toolbox/toolbox_basic/affine/pan.1.pgm | 59 ++++++++++++ .../common/toolbox/toolbox_basic/affine/readpgm.m | 26 ++++++ .../toolbox/toolbox_basic/affine/simulation.m | 42 +++++++++ .../toolbox_basic/affine/sports1_11_28.jpeg | Bin 0 -> 23655 bytes .../toolbox/toolbox_basic/affine/test_affine.m | 33 +++++++ 21 files changed, 775 insertions(+) create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/README create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/carve_it.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/compute_AD.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/compute_AD_disp.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/compute_J.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/find_AD.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/find_D.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/find_center.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/gen_feature_s.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/grad.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/hemisphere_s.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/im.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/iter_AD.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/m_interp4.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/norm_inten.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/pan.0.pgm create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/pan.1.pgm create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/readpgm.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/simulation.m create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/sports1_11_28.jpeg create mode 100755 SD-VBS/common/toolbox/toolbox_basic/affine/test_affine.m (limited to 'SD-VBS/common/toolbox/toolbox_basic/affine') diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/README b/SD-VBS/common/toolbox/toolbox_basic/affine/README new file mode 100755 index 0000000..e578a74 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/README @@ -0,0 +1,5 @@ +Top level program is "compute_AD.m". Use "compute_AD_disp.m" if one +wants to display results as program runs. + +The testing programs are called "simulation.m" for synthetic images, +and "test_affine.m" for real images. diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/carve_it.m b/SD-VBS/common/toolbox/toolbox_basic/affine/carve_it.m new file mode 100755 index 0000000..1a44f89 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/carve_it.m @@ -0,0 +1,25 @@ +function img = carve_it(I,center,window_size_h) + +[size_y,size_x]= size(I); +min_x = round(center(1)-window_size_h(1)); +max_x = round(center(1)+window_size_h(1)); +min_y = round(center(2)-window_size_h(2)); +max_y = round(center(2)+window_size_h(2)); +window_size = window_size_h*2 +1; + +if (min_x <1)|(max_x > size_x)|(min_y<1)|(max_y>size_y), + disp('window too big'); + center + window_size_h + img = zeros(window_size(2),window_size(1)); + n_min_x = max(1,round(min_x)); + n_min_y = max(1,round(min_y)); + n_max_x = min(size_x,round(max_x)); + n_max_y = min(size_y,round(max_y)); + img(1+(n_min_y-min_y):window_size(2)-(max_y-n_max_y),1+(n_min_x-min_x):window_size(1)-(max_x-n_max_x))=I(n_min_y:n_max_y,n_min_x:n_max_x); +else + img = I(center(2)-window_size_h(2):center(2)+window_size_h(2),... + center(1)-window_size_h(1):center(1)+window_size_h(1)); +end + + diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/compute_AD.m b/SD-VBS/common/toolbox/toolbox_basic/affine/compute_AD.m new file mode 100755 index 0000000..a39acd6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/compute_AD.m @@ -0,0 +1,90 @@ +function [A,D,mask] =... +compute_AD(img_i,img_j,center_i,center_j,window_size_h,num_iter,w,num_trans,Dest,mask) +% +% function [A,D,mask] = ... +% compute_AD(img_i,img_j,center_i,center_j,window_size_h,num_iter,w, +% mask,num_trans) +% +% A: Affine motion; +% D: Displacement; +% +% img_i, img_j: the two image(in full size); +% center_i, center_j: the centers of the feature in two images; +% window_size_h: half size of the feature window; +% num_iter: number of iterations; +% w: parameter used in "grad.m" for computing gaussians used for +% gradient estimation; +% +% num_trans: OPTIONAL, number of translation iteration; default = 3; +% mask: OPTIONAL, if some area of the square shaped feature window should +% be weighted less; +% + +% +% Jianbo Shi +% + +if ~exist('Dest'), + Dest = [0,0]; +end + +if ~exist('mask'), + mask = ones(2*window_size_h+1)'; +end + +% set the default num_trans +if ~exist('num_trans'), + num_trans= 3; +end + +% normalize image intensity to the range of 0.0-1.0 +img_i = norm_inten(img_i); +img_j = norm_inten(img_j); + +window_size = 2*window_size_h + 1; +I = carve_it(img_i,center_i,window_size_h); +J = carve_it(img_j,center_j,window_size_h); + +% init. step +J_computed = I; +D_computed = Dest; +A_computed = eye(2); +J_computed = compute_J(A_computed,D_computed,img_i,center_i,window_size_h); + +%% level of noise +sig = 0.1; + +records = zeros(num_iter,6); +errs = zeros(1,num_iter); + +k = 1; +% iteration +while k <= num_iter, + [A,D] = iter_AD(J_computed,J,mask,w,k,num_trans); + + A_computed = A*A_computed; + D_computed = (A*D_computed')' + D; + + % compute the warped image + J_computed = compute_J(A_computed,D_computed,img_i,center_i,window_size_h); + + % compute the SSD error + errs(k) = sqrt(sum(sum((mask.*(J_computed-J)).^2)))/prod(size(J)); + + % update the mask, discounting possible occlusion region + if (k>num_trans), + mask = exp(-abs(J_computed-J)/sig); + end + + % record the A and D + records(k,:) = [reshape(A_computed,1,4),reshape(D_computed,1,2)]; + + k = k+1; +end + +[tmp,id] = min(errs); +A = reshape(records(id,1:4),2,2); +D = reshape(records(id,5:6),1,2); + +J_computed = compute_J(A,D,img_i,center_i,window_size_h); +mask = exp(-abs(J_computed-J)/sig); diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/compute_AD_disp.m b/SD-VBS/common/toolbox/toolbox_basic/affine/compute_AD_disp.m new file mode 100755 index 0000000..f2e6c62 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/compute_AD_disp.m @@ -0,0 +1,103 @@ +function [A,D,mask] =... +compute_AD_disp(img_i,img_j,center_i,center_j,window_size_h,num_iter,w,fig_disp,num_trans,Dest,mask) +% +% function [A,D,mask] = ... +% compute_AD_disp(img_i,img_j,center_i,center_j,window_size_h,num_iter,w, +% fig_disp,mask,num_trans) +% +% Computing affine transform for matching to image patches. Display results +% as program runs. +% +% A: Affine motion; +% D: Displacement; +% +% +% img_i, img_j: the two image(in full size); +% center_i, center_j: the centers of the feature in two images; +% window_size_h: half size of the feature window; +% num_iter: number of iterations; +% w: parameter used in "grad.m" for computing gaussians used for +% gradient estimation; +% fig_disp: figure for display; +% +% num_trans: OPTIONAL, number of translation iteration; +% mask: OPTIONAL, if some area of the square shaped feature window should +% be weighted less; +% + + +% +% Jianbo Shi +% + +if ~exist('mask'), + mask = ones(2*window_size_h+1)'; +end + +if ~exist('Dest'), + Dest = [0,0]; +end + +% set the default num_trans +if ~exist('num_trans'), + num_trans= 3; +end + +% normalize image intensity to the range of 0.0-1.0 +img_i = norm_inten(img_i); +img_j = norm_inten(img_j); + +window_size = 2*window_size_h + 1; +I = carve_it(img_i,center_i,window_size_h); +J = carve_it(img_j,center_j,window_size_h); + +% init. step +D_computed = Dest; +A_computed = eye(2); +J_computed = compute_J(A_computed,D_computed,img_i,center_i,window_size_h); + + + +figure(fig_disp);subplot(1,3,1);imagesc(I);colormap(gray);axis('image'); +subplot(1,3,3);imagesc(J);axis('image'); +drawnow; + +sig = 0.1; + +records = zeros(num_iter,6); +errs = zeros(1,num_iter); + +k = 1; +% iteration +while k <= num_iter, + [A,D] = iter_AD(J_computed,J,mask,w,k,num_trans); + + A_computed = A*A_computed; + D_computed = (A*D_computed')' + D; + + % compute the warped image + J_computed = compute_J(A_computed,D_computed,img_i,center_i,window_size_h); + + % compute the SSD error + errs(k) = sqrt(sum(sum((mask.*(J_computed-J)).^2)))/prod(size(J)) + + % update the mask, discounting possible occlusion region + if (k>num_trans+1), + mask = exp(-abs(J_computed-J)/sig); + end + + % record the A and D + records(k,:) = [reshape(A_computed,1,4),reshape(D_computed,1,2)]; + + figure(fig_disp);subplot(1,3,2);imagesc(J_computed);axis('image'); + title(sprintf('iter:%d: dx=%3.3f, dy = %3.3f',k,D_computed(1),D_computed(2)));drawnow; + + k = k+1; +end + +[tmp,id] = min(errs); +A = reshape(records(id,1:4),2,2); +D = reshape(records(id,5:6),1,2); + +J_computed = compute_J(A,D,img_i,center_i,window_size_h); +mask = exp(-abs(J_computed-J)/sig); diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/compute_J.m b/SD-VBS/common/toolbox/toolbox_basic/affine/compute_J.m new file mode 100755 index 0000000..80db273 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/compute_J.m @@ -0,0 +1,31 @@ +function [JJ,mask] = compute_J(A,D,I,center,window_size_h) +%% function J = compute_J(A,D,I,center,window_size_h) +% + +[size_y,size_x] = size(I); + +center_x = center(1); +center_y = center(2); + +[XX,YY] = meshgrid(1:size_x,1:size_y); +x = reshape(XX,size_x*size_y,1); +y = reshape(YY,size_x*size_y,1); +index(:,1) = x-center_x; +index(:,2) = y-center_y; + +position_new = A*index'+ [D(1),0;0,D(2)]*ones(2,size_x*size_y); +position_new(1,:) = position_new(1,:)+center_x; +position_new(2,:) = position_new(2,:)+center_y; + +position_new_x = reshape(position_new(1,:),size_y,size_x); +position_new_y = reshape(position_new(2,:),size_y,size_x); + +[J,mask]= m_interp4(I,position_new_x,position_new_y); + +JJ = J(center(2)-window_size_h(2):center(2)+window_size_h(2),... + center(1)-window_size_h(1):center(1)+window_size_h(1)); +mask = mask(center(2)-window_size_h(2):center(2)+window_size_h(2),... + center(1)-window_size_h(1):center(1)+window_size_h(1)); + + + diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/find_AD.m b/SD-VBS/common/toolbox/toolbox_basic/affine/find_AD.m new file mode 100755 index 0000000..3cccefb --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/find_AD.m @@ -0,0 +1,82 @@ +function [A,D] = find_AD(I,J,mask,w) +% +% [A,D] = find_AD(I,J,mask,w) +% +% find the matrix affine transform A and displacement D, +% such that SSD difference of I(Ax-d)-J(x) is minimized, +% + +% +% Jianbo Shi +% + + +[gy1,gx1] = grad(I,w); +[gy2,gx2] = grad(J,w); + +gx = 0.5*(gx1+gx2); +gy = 0.5*(gy1+gy2); + +[size_y,size_x] = size(I); +[center_y,center_x] = find_center(size_y,size_x); +mask = mask(w+1:size_y-w,w+1:size_x-w); + +[x,y] = meshgrid(1:size_x,1:size_y); +x = x- center_x; +y = y-center_y; + +x = x(w+1:size_y-w,w+1:size_x-w); +y = y(w+1:size_y-w,w+1:size_x-w); + +gx_sqr = gx.*mask.*gx; +gx_gy = gx.*mask.*gy; +gy_sqr = gy.*mask.*gy; + +x_sqr = x.*x; +x_y = x.*y; +y_sqr = y.*y; + +T= zeros(6,6); +T(1,1) = 0.5*trapz(trapz(gx_sqr.*x_sqr)); +T(2,1) = trapz(trapz(gx_gy.*x_y)); +T(3,1) = trapz(trapz(gx_sqr.*x_y)); +T(4,1) = trapz(trapz(gx_gy.*x_sqr)); +T(5,1) = trapz(trapz(gx_sqr.*x)); +T(6,1) = trapz(trapz(gx_gy.*x)); +T(2,2) = 0.5*trapz(trapz(gy_sqr.*y_sqr)); +T(3,2) = trapz(trapz(gx_gy.*y_sqr)); +T(4,2) = trapz(trapz(gy_sqr.*x_y)); +T(5,2) = trapz(trapz(gx_gy.*y)); +T(6,2) = trapz(trapz(gy_sqr.*y)); +T(3,3) = 0.5*trapz(trapz(gx_sqr.*y_sqr)); +T(4,3) = trapz(trapz(gx_gy.*x_y)); +T(5,3) = trapz(trapz(gx_sqr.*y)); +T(6,3) = trapz(trapz(gx_gy.*y)); +T(4,4) = 0.5*trapz(trapz(gy_sqr.*x_sqr)); +T(5,4) = trapz(trapz(gx_gy.*x)); +T(6,4) = trapz(trapz(gy_sqr.*x)); +T(5,5) = 0.5*trapz(trapz(gx_sqr)); +T(6,5) = trapz(trapz(gx_gy)); +T(6,6) = 0.5*trapz(trapz(gy_sqr)); + +T = T+T'; + +J = J(w+1:size_y-w,w+1:size_x-w); +I = I(w+1:size_y-w,w+1:size_x-w); + + +diff = (J-I).*mask; +b(1) = trapz(trapz(diff.*gx.*x)); +b(2) = trapz(trapz(diff.*gy.*y)); +b(3) = trapz(trapz(diff.*gx.*y)); +b(4) = trapz(trapz(diff.*gy.*x)); +b(5) = trapz(trapz(diff.*gx)); +b(6) = trapz(trapz(diff.*gy)); + +a = inv(T)*b'; + +A = [1+a(1), a(3); +a(4),1+a(2)]; + +D= [a(5),a(6)]; + diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/find_D.m b/SD-VBS/common/toolbox/toolbox_basic/affine/find_D.m new file mode 100755 index 0000000..1e42cb2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/find_D.m @@ -0,0 +1,65 @@ +function D = find_D(I,J,mask,w) +% +% function D = find_D(I,J,mask,w) +% +% find the vector D such that it minimizes then +% difference between I(Ax-d)-J(x). +% +% mask: the weight matrix, +% w: window size for estimating gradiant, use a large value +% when A,D are large. +% + +% +% NOTE: Because gradient values on the boarder regions of +% I and J can not be computed accuately when using +% a gaussian of large support, those boarder regions +% of width w are not used in computing D. +% + +% +% Jianbo Shi +% + +[gy1,gx1] = grad(I,w); +[gy2,gx2] = grad(J,w); + +gx = 0.5*(gx1+gx2); +gy = 0.5*(gy1+gy2); + +[size_y,size_x] = size(I); +[center_y,center_x] = find_center(size_y,size_x); +mask = mask(w+1:size_y-w,w+1:size_x-w); + +[x,y] = meshgrid(1:size_x,1:size_y); +x = x- center_x; +y = y-center_y; + +x = x(w+1:size_y-w,w+1:size_x-w); +y = y(w+1:size_y-w,w+1:size_x-w); + +gx_sqr = gx.*mask.*gx; +gx_gy = gx.*mask.*gy; +gy_sqr = gy.*mask.*gy; + + +T= zeros(2,2); + +T(1,1) = 0.5*trapz(trapz(gx_sqr)); +T(2,1) = trapz(trapz(gx_gy)); +T(2,2) = 0.5*trapz(trapz(gy_sqr)); + +T = T+T'; + +J = J(w+1:size_y-w,w+1:size_x-w); +I = I(w+1:size_y-w,w+1:size_x-w); + + +diff = (J-I).*mask; +b(1) = trapz(trapz(diff.*gx)); +b(2) = trapz(trapz(diff.*gy)); + +a = inv(T)*b'; + +D= [a(1),a(2)]; + diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/find_center.m b/SD-VBS/common/toolbox/toolbox_basic/affine/find_center.m new file mode 100755 index 0000000..b12ac7b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/find_center.m @@ -0,0 +1,4 @@ +function [center_x,center_y] = find_center(size_x,size_y) + +center_x = 0.5*(size_x +1); +center_y = 0.5*(size_y +1); diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/gen_feature_s.m b/SD-VBS/common/toolbox/toolbox_basic/affine/gen_feature_s.m new file mode 100755 index 0000000..3c113e9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/gen_feature_s.m @@ -0,0 +1,17 @@ +function I = gen_feature_s(size_of_feature) +% function I = gen_feature(size_of_feature) +% generates a spherical features with size +% of "size_of_feature" +% + +ss = round(0.4*size_of_feature); +[X,Y,II] = hemisphere_s(ss); + +II = abs(II); +II = 1/max(max(II))*II; + +I = zeros(size_of_feature,size_of_feature); + +t = round((size_of_feature-ss)/2); + +I(1+t:1+t+ss,1+t:1+t+ss) = II; diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/grad.m b/SD-VBS/common/toolbox/toolbox_basic/affine/grad.m new file mode 100755 index 0000000..53bab55 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/grad.m @@ -0,0 +1,24 @@ +% gradient of an image +% coordinates (r, c) follow matrix convention; +% the gaussian is truncated at x = +- tail, and there are samples samples +% inbetween, where samples = hsamples * 2 + 1 + +function[gr,gc] = gradient(image, hsamples) + +tail=4; +samples = hsamples * 2 + 1; + +x = linspace(-tail, tail, samples); +gauss = exp(-x.^2); +n = gauss * ones(samples,1); +gauss = gauss/n; + +gaussderiv = -x.*gauss; +n = -gaussderiv*linspace(1,samples,samples)'; +gaussderiv = gaussderiv/n; + +gr = conv2(conv2(image, gaussderiv','valid'), gauss,'valid'); +gc = conv2(conv2(image, gaussderiv,'valid'), gauss','valid'); + +%gr = conv2(conv2(image, gaussderiv','same'), gauss,'same'); +%gc = conv2(conv2(image, gaussderiv,'same'), gauss','same'); diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/hemisphere_s.m b/SD-VBS/common/toolbox/toolbox_basic/affine/hemisphere_s.m new file mode 100755 index 0000000..5300183 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/hemisphere_s.m @@ -0,0 +1,27 @@ +function [x,y,z] = hemisphere(r) +%HEMISPHERE Generate sphere and transform from spherical coordinates. +% +% [X,Y,Z] = HEMISPHERE(N) generates three (n+1)-by-(n+1) +% matrices so that SURF(X,Y,Z) produces a sphere. +% +% [X,Y,Z] = HEMISPHERE(R,N) generates three (n+1)-by-(n+1) +% matrices so that SURF(X,Y,Z,R) produces a sphere colored by R +% +% [X,Y,Z] = HEMISPHERE(R,THETA,PHI) converts from spherical coordinates +% to cartesian coordinates. + +% Modified from +% Clay M. Thompson 4-24-91 +% Copyright (c) 1991-92 by the MathWorks, Inc. +% by Carlo Tomasi + +error(nargchk(1,3,nargin)); + +n = r; +% 0 <= theta <= 2*pi and 0 <= phi <= pi/2 +[theta,phi] = meshgrid((pi/n/2)*[-n:2:n],(pi/2/n)*[-n:2:n]); +r = ones(n+1,n+1); + +x = r .* cos(phi) .* sin(theta); +y = r .* sin(phi); +z = r .* cos(phi) .* cos(theta).*phi.*theta; diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/im.m b/SD-VBS/common/toolbox/toolbox_basic/affine/im.m new file mode 100755 index 0000000..6450120 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/im.m @@ -0,0 +1,3 @@ +function im(I) + +imagesc(I);axis('image');drawnow; \ No newline at end of file diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/iter_AD.m b/SD-VBS/common/toolbox/toolbox_basic/affine/iter_AD.m new file mode 100755 index 0000000..50bdae1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/iter_AD.m @@ -0,0 +1,26 @@ +function [A,D] = iter_AD(I,J,mask,w,k,num_trans) +% +% function [A,D] = iter_AD(I,J,mask,w,k,num_trans) +% +% find the affine motion A, and displacement D, +% such that difference between I(Ax-D) and J(x) is minimized. +% If k <= num_trans, only translation is computed. This is useful +% in practice, when translation is relative large. +% +% mask: the weight matrix, +% w: window size for estimating gradiant, use a large value +% when A,D are large. +% + +% +% Jianbo Shi +% + + +if k <= num_trans, + D = find_D(I,J,mask,w); + A = eye(2); +else + [A,D] = find_AD(I,J,mask,w); +end + diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/m_interp4.m b/SD-VBS/common/toolbox/toolbox_basic/affine/m_interp4.m new file mode 100755 index 0000000..314f140 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/m_interp4.m @@ -0,0 +1,49 @@ +function [F,mask] = m_interp4(z,s,t) +%INTERP4 2-D bilinear data interpolation. +% ZI = INTERP4(Z,XI,YI) assumes X = 1:N and Y = 1:M, where +% [M,N] = SIZE(Z). +% +% Copyright (c) 1984-93 by The MathWorks, Inc. +% Clay M. Thompson 4-26-91, revised 7-3-91, 3-22-93 by CMT. +% +% modified to + + +[nrows,ncols] = size(z); + + +if any(size(z)<[3 3]), error('Z must be at least 3-by-3.'); end +if size(s)~=size(t), error('XI and YI must be the same size.'); end + +% Check for out of range values of s and set to 1 +sout = find((s<1)|(s>ncols)); +if length(sout)>0, s(sout) = ones(size(sout)); end + +% Check for out of range values of t and set to 1 +tout = find((t<1)|(t>nrows)); +if length(tout)>0, t(tout) = ones(size(tout)); end + +% Matrix element indexing +ndx = floor(t)+floor(s-1)*nrows; + +% Compute intepolation parameters, check for boundary value. +d = find(s==ncols); +s(:) = (s - floor(s)); +if length(d)>0, s(d) = s(d)+1; ndx(d) = ndx(d)-nrows; end + +% Compute intepolation parameters, check for boundary value. +d = find(t==nrows); +t(:) = (t - floor(t)); +if length(d)>0, t(d) = t(d)+1; ndx(d) = ndx(d)-1; end +d = []; + +% Now interpolate, reuse u and v to save memory. +F = ( z(ndx).*(1-t) + z(ndx+1).*t ).*(1-s) + ... + ( z(ndx+nrows).*(1-t) + z(ndx+(nrows+1)).*t ).*s; + +mask = ones(size(z)); + +% Now set out of range values to zeros. +if length(sout)>0, F(sout) = zeros(size(sout));mask(sout)=zeros(size(sout));end +if length(tout)>0, F(tout) = zeros(size(tout));mask(tout)=zeros(size(tout));end + diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/norm_inten.m b/SD-VBS/common/toolbox/toolbox_basic/affine/norm_inten.m new file mode 100755 index 0000000..8e8865b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/norm_inten.m @@ -0,0 +1,11 @@ +function I = norm_inten(J) +% +% I = norm_inten(J) +% +% normalize image intensity to the range of 0.0-1.0 +% + +max_J = max(max(J)); +min_J = min(min(J)); + +I = (J-min_J)/(max_J-min_J); diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/pan.0.pgm b/SD-VBS/common/toolbox/toolbox_basic/affine/pan.0.pgm new file mode 100755 index 0000000..2e7b5f6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/pan.0.pgm @@ -0,0 +1,53 @@ +P5 +# CREATOR: XV Version 3.10a Rev: 12/29/94 +128 96 +255 +qquvvvvwzyz{}~qrrsvxwxyzzz{{|~~tuwuruzzyzz{}}}tvwxyxwwz{{z|{|}tvwwyz{ywz}}mzuuvvvurvuwxz{{{}BUwxz}~}~{{GcZW}}~}~Geoxae~~ηFakswveyӺùIbjnpu|x_nbb_eq¿漭㖽>q}̶Gbjkloqw|pnrcbbehq.ٻfbf0^xF_VYqH^ehkoopqyf|x;33>AVyi5!qcMi<2<3WWB=XFoZMqeHNtMdfVwNiv\uat}c*dHY]ZtG]aced`C233++%)(*59:@7B>F>FEA=<\g^gb\^Ya][\PD83.2X_=Hj?42)Wh3%GkgpD8xb`vJQjFktVR|LvtTytLU{OdoU}N]sSwZl[+eIVYRqI[^___W?519+&'112>;9G<@;E8BG<:5V[FYYLPIHHMA4=A83:PMd{m@BdmUOi?$ByC!'Q_pS$l|hSrJMqG^ugpOs~Rq|QRN\wM}SYyQuPeX#_NQ_RpFX\]^YK512:)&(032>?9B=E:G7AJ@B;W\GRWHOHEJIB5>C@:4NQ^xp<5[njFlJ, %pIQk]L*&Xw{qReNBnIGeԨYjKayPRXQQuXQOtUb^%[QPcRoGUY]YNC445=)%+.01?98EAG=E6>H@B7BFRwvN\r>itK2WRJmRZ9(AepvPZ[BpVCfΨU]N[zSKgUPjbJQpX\d%UVPhNmFUYYTG>26;?*'+247><;HCM@I7<J@H:;JAF>O[SM_PR]XVLSJ8>8565BD_v>)hiEwU-"lLGpcaHA$U~o~wRjLJrCCZuDtsF}yPqSmlTMsY`tZ~2CeMrRqIRSMGMXPF>A.**0.APIR>L?9K;DEQ]XP`VS]\[OML5?C8?7BDX|~R[sBm_7[_"=cqfj_W;Is|~T\[HvRCa^DxGjHqPgW\yXSee^Z9@kLrPmGOOIM[\MC>@+(*-,7>;GAJYUU_ZU^ZOKGP?IH2?5>GRue&KuK]gH#DoNXhj]FE]jb|rvZRmIp_?fbCxV[NdQ\[UQyW`o[\A<qNvPmHOKFM[\NB>?)(,,+>BBDSHP@FA8ICG@F\WV]bS_\KLISOED2:4:FNpt85teThQ+*ENWOG6*+;PVm|xkPpK`pVpzuoZYW_ZhPPm`[{[\}L;~wSvQiFIHDLXVJ@<>(''+)7AEESGO4*))(ATq~Q[VIt<6:RTq}UVV|a^x]^afV+nOoS]EFEELOB/&5?ABREK=CI;KLIH=b_\YVPMT[cZVVGDA4<6>BT}m+N|\[f/"$');GGC7,%2W]l^UhHk:+DEZ`WwTrVmn]Xbyeb\%hQlV]GGHDJL;+.%%1'1-!?L@GMIN@\aYTVVQWgaWPMKIC1:69* ,NUVzmV{GW5 #FBuhZUj\cXiXW}epmcc(^Pf[[EEFDJH4$&(COEZsW.Q=GQDR:V]U^]`_`\^[M]VOI8868CIf_!a_.')/3:1-35.+)#,DPFcbdY:1,;M[Xv\m\k[\~Wopgas(TUafUBCGBF:&&""$.ReV4 8A?NHDJ>O>DPISAP][dcb[ZSZfX`QBH?37/AD\u0F~T.31./:?:'9DBGJW}dVj@5"3@XXWo^}_xY[nbjyjd|+R[ZlWDFGDA3+,!12'6FDIKJO>RBGUMUCQdcjfaWWT^gZXYFHK291KhZuWHGDDE.#  +!"9HGJOLUCPEHRKMFJaf`XW^_e`^aUa^KI5:.,FLkd$I#:WRQXXiy|wzs;1/]af]%! DuZg\g`Wh_i}ecje|EDiXzVEGFDC1-)%0ZdH')3;=HGEMKVBQJJTJNHHfc`WOjg_X]dXabOK674+EIdp6 +!Njv}}v>-"S~vz{csbb`fdgaohxXAs\[GFFFC/44,-ZkL+*0=AGFCILUHQLJPAMHA^ZX[OkcVXdfYX]LLA3:1>K^C $Tgmt{vuz{}|>%R|pnhs^qbmZzkfr]AOUaga^bcehnppprvvvtw{xz{x~v)+UL>516HZU?8?QhsE!cFFIL[bcfjlnoqruwyyz|~~}}zE:\?+)69:|=.0BTx^28^nmkijiiijfffdbcb`aa`_]^^``_\\\\]^`__a`b`bdb_GHJM[XPNOQTTVVWYZZ[[\\^]]^_`aabbbbbbcdfgfggghikllmoppqqrqqrrsrB>eSLIE:[C2,94>BB.7AB11< '' +"5 $EXg~p|W5((..!!%GHN)   5*U{`_uH\h_xfDt|~Ngk!  /t_$$&T={@^z @U\iuxxzxs3Zs-AyjvO@2RRIQMxxst~KNNNOO_WesG_jbxfHw}Nnj   +5|]$##Z??bpQdPY`inr}|u}e7Vu%Ovlˁz8HwgMeZxvrrLNNNVgjYgvKegcygJx}~Qsi   !#3_O#>EL\cOONWWRT]kqkozd:1><"2LTSqgM=FNHFIUqrqpOPRRdmkXfuQjhg~jLzPxf + + +#&!]mOKIOY_badin\G:6$WZbܬNRJDKB>BgqvvoMNQVgolUiv[sdcqN}S|b  +  +%%ۼ׎GOPMKQ\\SS=&FX[f\KWZOUOF|uzz~tMPRXjqlJb|e{ebyzV~|[\ +   + !$' صnILJG;qVfqkCYaDGZbOVWQzwzKMPXinkC[}awhb|Y|\Z +    $%>뷗\{S@Fb羥lY\Z<=5czK^nb{}t{KMQXjojFWfyqf`|_Y  +  '& K؞h]j7PwO|w~pzLNOZloh>Ncsyh[|}aY    %&N﷜exhG?5Lp^;^zs~qwLMOZloh>Fcpmc~b_   '%8鼸9>~p^k}bz\w! +  )' xf\WVIHnjz|ϴ{kMOOZoqhE9~`pwbva|*  + ()a`Ê|ɰýqbNNP^ppiC0{ayujql4 % +"*(gaG]uVŭùqSMNQ^qohI&jYfuqdsz6 + ! !)+ >S_s²{p~JMMO_wwpcVapXWkWr{OKfpk' $!#..!^ef}rWh¥x¸ſx{DKOQbrrtwy|GNBF7sgkwŭ¼s?MPRYF997:<><>>><<;;:<AEINS[aflqtx}vͽILLMB$ LԲIKKJD-  T׶#&$# ! !  !!JKLIF7  PӻC&$#"  !""!"""!"#"%$EJLHC;' ]ñw%&%##"!#"!"#"#""""#$$&'IJIHF?. u›ľ2)&$"#$#!"""#"#&%%&)(()HJKGDA7$  &Ư߲W,(%%%$"#$####$&&()(+.0GHJJHB=, @衤$('''%%&''&%&&'(),*,/2FGFGEB?2 [ԯ❝9-))('%'''&&((+---.022GHHGFB?7& oϦۻʙn+++(()'&%&'*+--.04333FFFGFB?9*~קַ§.-+*((')()+,-./013444FGJIGDA;0  "ݵ𳷽S5/++,+++-/./10362251DGGGEB@<4& BҰʴ⡶)-.,,+*,.00122244444FFEEDA@=8- _ླྀ±źћ60,,-.../0334555553/BBDDCB?;6." y̹ܵǹđn-.-/../112333335421EDDEB@?<80% 6ѕIJ6.,/121134464543244ADECAA?<93' NⲫĹ̬Z20012/233121132122@?B@A?A=:4+!dͷȵžæ/44314442034532441BABBCB@><82& љĬ}Q84443444222333121>@CDDCB?<93(Dú݊bnt88432421255422122=>@AABA@<94+"nݱ캙vkwwyyWpvpU973222122233220252@AABCB@><97.#(rH 9ltvpmb\ZZrT !&nks2.BS@78423322312311221/11>@ABABA=<;72'(0&;_ggea\SQU]iSflV7@CDK<3443223322334443233110=>CCBBAB@<94)!  ""!!"""##%"#&'!(AW^_``\XY^XWbP%xmZ8:>FNI:899:7878557677766777554>?@BABB@?<95. !!"""##$%%##$%%&((''(-5@LSWYXVTRKDI^`hz`5*, /uaX=;=DOYI889:9::999879::999:98886 \ No newline at end of file diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/pan.1.pgm b/SD-VBS/common/toolbox/toolbox_basic/affine/pan.1.pgm new file mode 100755 index 0000000..9d57f70 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/pan.1.pgm @@ -0,0 +1,59 @@ +P5 +# CREATOR: XV Version 3.10a Rev: 12/29/94 +128 96 +255 +prsrxxwxz{{||||}~~ſ¿prsttuyxyyz{|{{|~tuuuwwvwyxzz{|}tuwwxxzyy{{{{||}~uvuwyyz{~{z~~~_`k{x{{zzywzyz{{{}~~8:E[{|}57@_WYĿ:9D`ny_iδ8:B^kryxc}ѷ¸8;C[gorv}wbned_gxߍ0mt9;D^iloquz~nqxifdefq1ͺ؁x^[rk4\|JSZ87A[gjknqtw{f䍀y962??Xvb0 nWGa7-84Z`HA`Hu_NulKQwIaiTxNcw]uZm|i&[~KQ_8:BZdeffcK5850)%)09::B6BAIAGIEB>]linhbc[e_^aRC71/4=Eera?=Y_=He<30(Wd0$FkenD9y_]wKQlImuVS|LvvSvrKT{MbqS|R[vSvUb]$\KM`;;CX`cba[A2/41)&2-/=74CC8H8?H?EUYVQF>7:>A,%(2-6A:;N@KBL:7L?G@UYJ@XEMQP\GTF@@4:58EHh}m/ 6nXOmG*3q<S{jJ$)&lwqnUvG[n>FUhJcLqV|StbWMzTcoY~3CiLq??ESURJA=46A+)*+*7>>>LEL>I?7G+,,0+<>>ES@KDGC;GBHBF^^X]aP[WEKBRNGC0969GKoq45teWjJERTOC3,7O_K*#h}{oRqJanUirwqW]U`WkRQne[Z]sT1t~PrACEJIFKYWLB>>'#(-*8>>@REM) + &':=@CSDJ>GHUC/ G~PZWIr:37QSnV}V~Tyf_{\b|ca\&aMeACEHGELUF6&6<@BREH;?KcaYUSNLRX`YWUEDB4;7?EVm*O{P'$&)8DIG;.'.S[E'2}^RiGh:*ED[^VtToTjr\Vcqj`b"[Oa?CHIGELQ?/1) -#+'&7=DTHI==L>GOFO=^\WRPUSYd^PKIHHC062;EP{}7 +=S*# (>RG9?9/ @VJ3'j~~mUyGX1!FCujYUfZaXgYVzffubk'UR]ACDEFFKL8'&#@UERnX-9BCNEDC=L=FPFL:X\RRSZYc]]YKPPOI3616CLnL".),*-8A@;53/*%$8HH;R}~YmLC/#;Ec~Ya[`[b\YVpmgcr%RWXCCEFHFKG-+OA3;tn98@@QFEJAS?GRGR:S`W]\_b`W[[P]VNH8845BIf`" #&+/40/78/,+%!8NE>#B^aW;2.9NYW~v]q^q^Ys^luid{+O_UACEEFCE>''')',JeZ=!7AQ@EPEP?P^Ycdc]WOXd\cSDG>46.CF[s4!!,42-.7;8)-EKEP@THIULTAMbajebUUV`h[XUFIN2;-;FW}F%(4HPH=blQ49:1$f}wuZrF%.MjXee^^{]hculhf?GlVBDDEHFC1(- +)2%0@DEKHS>SFIUFLCHachZYXW`fbUOYPUO19*2GPuB'8Od`Uel<)51Uz}`qN&QuTpwaaoYm]tr`fie~EAqWEEGIHEG0! +#"6FEHQKTEQDERKMDEae^UR^^d\V[P`^KI3IIFOLU@NIHTKKDCe_ZTMkg\UXcW^^JH6:6+DGb<@es~|I0*3.2y}s|zaueeae_h`khr]:z}YFEFIIJI323()UkO*(.9AIDBKGOCNJKRCNHA^UT[Jg`WVbdZV[JNA5<0>I\.Ehpx}yxz{I'!,$#g~znlgt[qchYufwiii;oYEGIKLIPI;:GM[c^X[]acgklmmqpoqswuvwt{zy}zBKSG<69G[ZI@EUlwT(IFEFILMYgiikoprvwy}}Y-UM2)-88{}B/'8Xsi4(Imnnmnmlhhigeccecb__`a^^\^]\\\]^]]][\^^``bbceebFGGJLLZYOMNOOQRTTSUVYYYZ[[\\^^___^^^`abbcegffffgijiknnnonooqY(2`TGCA=KK9>V_xwHPoHIJMMN^lqopqrsuwzz}n4Ajymei`_vM@FGHJKKZghgilnoruwwz|}~~M;awWj~}|{yxwvtrpomlkhffebaaa_\[YWTKMMLNMK8" +  + + + + + + + + +  +  ,?QttaA!!"$&%$&'''&(&'&'(&%%#%$"$$%#!"##"HKKJJKI?+    + +     + +ASd|>AGRve5"++!$" .12,!! "! ! JJLMLLKD5  +    +  +  +3P\m|E?Wwz*11''1/ =AB)  KKNMKKID;%->5-:3:@C.5AC52=  (+ 3 !?Wf{~o{~(00&%-. #$EDN+   8WX=GCMZTZfdIL]IJLJKKKJA+1D3,@8FKL.9GG64F    kj(#$4S`u£|x3qq;S69G6*MQQ( + +NeeRMDRd^]feGG[JJKLONMKE2>S@9LAVXY9H[]CG_) + + + \[%"$>cÍUYbkswwx_p:{s3Ov-Ivj΀z7GuhLc[{tsJLNNOOUfkW`zL\ia|oHv~Soo  #& 5bR$AHMpMNUXSSZhqlkx^r0QK-.<:#2NUQmeO:FMGCHRssqPORRRSdnmYb|Naj_}rJxTsj   +$%  yFLIQY]dhbgnvl=77*,43$8UZ\lϸIY\DNHBF\oopMOOOORdnmV`|Sgk^~uKwTuh  #%+UKKHEJS^dda[^/1:8':VX`|֪KPICMD?AbnrqNNMQSUgpoU^SgiZ{MxSye + + +  +%%!ٺɒBJNMKQ[\WLG9$ ! >W[bx۳Z5G_LZN@qnvsMNOQQTgpnP^Zni\~}QuU|c  + + +$& _yFKLKLNKOK'%%EX[kAzqvʅ^^vjT[[;;*UzKYn^}x{LMNOQViqkDNbqt_^z__  %&A࢏f]kAjnǡnOOP7.Do[6^trPMMPRVjokIBiln~]xad  +%'!?渲7<3La^CVlǨMNOQRYlpmK>rclx^v[o   +')`QEMTQFHBs~ѳNMPOOYmpkN8|~`kvat^z' +  '&:Y[[UTG@ʎwzϴLMNPPYnrlO6z]tpcn`z-  +   ))˵٠aǍz|DZ¼uNPQPQ]qtlN+o`{}tmgmw7 & +! !/MOHnlZFZ}Q¾ƪÿmNNMNQ]qtlP$a^]rvbxv9   !!xkD\P|]p~álLNPRR_wytgYbs]XpYk~UF{ees, $!!6RazrViƬxļnKLMPS`rssvy|LZ?HKDG:rknyƳ½wKLNPRZH9:99<=<>=@=::<;;==?@BGLORUY_ciosx~оLKMOP^lnlllmnopsuuuwwvutsqpopnmmjhgeeb`__]\_x{}}~JLMKN\nrsru{}Յ{zvvtrrqpprqpoommmmkkihgheLKJNOK: + +  $',048:>CHNTX^chdLMLLMNH*  }ոo{LJJLJJG4 + E(%!KKLLIIH>% ټ{&#!! !!!!" !#LLKLKIE?-  ϭ2&$#""!!! !!""!!"!#""$MKLMJFGB5   4֥`+$#$$!$$""#! ######%'&KIJJIGEB:( Nζɻ#)'%$"###""#####!#%%&%&)KHHJIIFC?/ lɪᰡ<+($$$'&&$#$$%$#$%&&&),+KIHJJHGD?4# ⫗s(*(&'&&&&&&&&&'('&)*,..IHHIJFECA9(-ฤڬ7-,)(''&'''')(&'*-./123IIIHEFECA<0 =뾬ֽЫ\0-*)(''''('')*+,--0123HHGHHIGEC>4%Uó(,*+)))*+***+,-/223365GEHIFFDDB?7)k¶찯D0,**((*+++++./0344223GGHGGFIFCA<6-!Fة‘k0/-/.,-./01212342243DDDEGGECB@<7."`Īɼλ򹋦1.-.--.-0/0223310110CBDDECDB??<80$,{wټʶǼZ111/./0110111310110BABDEEFC@?=;4)  7ƺy0200010011331110121D?ACEDEECA>;7,#lͺqyqwnȽM5331121/1220100220?=@BDDDDB@=97.%!̯jrut~Uhj͟`9431121212111100/00@=AAEHGDC@>:62&RA*\qsrmaYWUkT#jj;=UG7322243122112100110-.?=>@CDEDCA><83* ,0$,Rfgeb_URU]hS + |bX5?BIL;2222201232332111221011/?<=>BDDA@BA>;4+!  !" !""!$$%$'&(6Q\\_b]ZXZXR^yY (܊o|Z:;AJOE7355356866544565565553311>=??BBCDCA@>950! "!!#"!""$$%#$$%%&*29GQUWYUTTLDEVWZeX9180>ךryM==AJTS<6799788768987677886676765 \ No newline at end of file diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/readpgm.m b/SD-VBS/common/toolbox/toolbox_basic/affine/readpgm.m new file mode 100755 index 0000000..a5fd7f2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/readpgm.m @@ -0,0 +1,26 @@ +function img = pgmread(filename) +% function img = pgmread(filename) +% this is my version of pgmread for the pgm file created by XV. +% +% this program also corrects for the shifts in the image from pm file. + + +fid = fopen(filename,'r'); +fscanf(fid, 'P5\n'); +cmt = '#'; +while findstr(cmt, '#'), + cmt = fgets(fid); + if length(findstr(cmt, '#')) ~= 1, + YX = sscanf(cmt, '%d %d'); + y = YX(1); x = YX(2); + end +end + +fgets(fid); + +%img = fscanf(fid,'%d',size); +%img = img'; + +img = fread(fid,[y,x],'uint8'); +img = img'; +fclose(fid); diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/simulation.m b/SD-VBS/common/toolbox/toolbox_basic/affine/simulation.m new file mode 100755 index 0000000..2186a6d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/simulation.m @@ -0,0 +1,42 @@ +clear + +figure(1);colormap(gray); + +%------------ Parameters -------------------------- +window_size_h = 40; +window_size = 2*window_size_h+1; +noise_level = 40/256; + +% define A and D +x_ext = -0.423; +ext = 1.232; +A = [ext+x_ext, 0.2534; 0.3423,ext]; + +D = [3,1]; + +%------------- compute image I and J --------------- +disp('generating I') +I_init = gen_feature_s(window_size); +[size_y,size_x] = size(I_init); + +%define image center +[center_x,center_y] = find_center(size_x,size_y); + +% adding noise to image I +I = I_init+noise_level*rand(size_y,size_x); +% make sure all intensities are positive +I = I.*(I>0); + +disp('computing J') +J_init = compute_J(A,D,I_init,[center_x,center_y],[window_size_h,window_size_h]); +J = J_init+noise_level*rand(size_y,size_x); +J = J.*(J>0); + + +%------------- compute A and residue ---------------- +c = [center_x,center_y]; +num_iter = 8; w = 9;win_h = [window_size_h,window_size_h]; + +fig_disp = 1; +[Ac,Dc,mask] = compute_AD_disp(I,J,c,c,win_h,num_iter,w,fig_disp); + diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/sports1_11_28.jpeg b/SD-VBS/common/toolbox/toolbox_basic/affine/sports1_11_28.jpeg new file mode 100755 index 0000000..39ebed5 Binary files /dev/null and b/SD-VBS/common/toolbox/toolbox_basic/affine/sports1_11_28.jpeg differ diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/test_affine.m b/SD-VBS/common/toolbox/toolbox_basic/affine/test_affine.m new file mode 100755 index 0000000..41b48b9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/test_affine.m @@ -0,0 +1,33 @@ +%%% This is a test program for Affine tracker %%%% + +disp(sprintf('This is a test program of Affine tracker')); + +%% read in images + +disp(sprintf('read in images')); +I = readpgm('pan.0.pgm'); +J = readpgm('pan.1.pgm'); + +figure(1); im(I); colormap(gray); +figure(2); im(J); colormap(gray); + + +figure(1);disp(sprintf('click on the center of a image window')); +c = round(ginput(1)); + +%% compute the displacement of that image window +disp(sprintf('computing...')); + +win_hsize_temp = [8,8]; +w = 3; +num_iter = 6; + +disp_flag = 1; + +win_h = win_hsize_temp + [w,w]; +if disp_flag == 1, + figure_id = 3; + [A,D,mask] = compute_AD_disp(I,J,c,c,win_h,num_iter,w,figure_id); +else + [A,D,mask] = compute_AD(I,J,c,c,win_h,num_iter,w); +end -- cgit v1.2.2