mosaic.m
上传用户:cnhygg
上传日期:2016-09-08
资源大小:73k
文件大小:2k
开发平台:

Matlab

  1. % load input images
  2. I1 = double(imread('left.jpg'));
  3. [h1 w1 d1] = size(I1);
  4. I2 = double(imread('right.jpg'));
  5. [h2 w2 d2] = size(I2);
  6. % show input images and prompt for correspondences
  7. figure; subplot(1,2,1); image(I1/255); axis image; hold on;
  8. title('first input image');
  9. [X1 Y1] = ginput2(2); % get two points from the user
  10. subplot(1,2,2); image(I2/255); axis image; hold on;
  11. title('second input image');
  12. [X2 Y2] = ginput2(2); % get two points from the user
  13. % estimate parameter vector (t)
  14. Z  = [ X2'  Y2' ; Y2' -X2' ; 1 1 0 0  ; 0 0 1 1 ]';  
  15. xp = [ X1 ; Y1 ];
  16. t  = Z  xp; % solve the linear system
  17. a  = t(1); % = s cos(alpha)
  18. b  = t(2); % = s sin(alpha)
  19. tx = t(3);
  20. ty = t(4);
  21. % construct transformation matrix (T)
  22. T = [a b tx ; -b a ty ; 0 0 1];
  23. % warp incoming corners to determine the size of the output image (in to out)
  24. cp = T*[ 1 1 w2 w2 ; 1 h2 1 h2 ; 1 1 1 1 ]; 
  25. Xpr = min( [ cp(1,:) 0 ] ) : max( [cp(1,:) w1] ); % min x : max x
  26. Ypr = min( [ cp(2,:) 0 ] ) : max( [cp(2,:) h1] ); % min y : max y
  27. [Xp,Yp] = ndgrid(Xpr,Ypr);
  28. [wp hp] = size(Xp); % = size(Yp)
  29. % do backwards transform (from out to in)
  30. X = T  [ Xp(:) Yp(:) ones(wp*hp,1) ]';  % warp
  31. % re-sample pixel values with bilinear interpolation
  32. clear Ip;
  33. xI = reshape( X(1,:),wp,hp)';
  34. yI = reshape( X(2,:),wp,hp)';
  35. Ip(:,:,1) = interp2(I2(:,:,1), xI, yI, '*bilinear'); % red
  36. Ip(:,:,2) = interp2(I2(:,:,2), xI, yI, '*bilinear'); % green
  37. Ip(:,:,3) = interp2(I2(:,:,3), xI, yI, '*bilinear'); % blue
  38. % offset and copy original image into the warped image
  39. offset =  -round( [ min( [ cp(1,:) 0 ] ) min( [ cp(2,:) 0 ] ) ] );
  40. Ip(1+offset(2):h1+offset(2),1+offset(1):w1+offset(1),:) = double(I1(1:h1,1:w1,:));
  41. % show the result
  42. figure; image(Ip/255); axis image;
  43. title('mosaic image');