stitch

این برنامه جهت چسباندن تصاویر به همدیگر مانند یک موزاییک عمل می کند ، که در ادامه می توانید مراحل اجرای آن را بطور کامل ببینید.

در این برنامه دو تکه تصویر رو به هم متصل می کنیم.

در گام اول هر دوتکه تصویر توسط دستور imread خوانده می شود.

در این مرحله تصویر اول در figure نمایش داده می شود، و دونقطه از کاربر گرفته می شود که این کار توسط تابع  ginput2 انجام می شود.

سپس به طور مشابه دو نقطه دیگر توسط این تابع از کاربر گرفته می شود.

% load input images

clc;clear;close all;

I1 = double(imread(‘D:\stitch\left.jpg’));

[h1 w1 d1] = size(I1);

I2 = double(imread(‘D:\stitch\right.jpg’));

[h2 w2 d2] = size(I2);

% show input images and prompt for correspondences

figure; subplot(1,2,1); image(I1/255); axis image; hold on;

title(‘first input image’);

[X1 Y1] = ginput2(2); % get two points from the user

subplot(1,2,2); image(I2/255); axis image; hold on;

title(‘second input image’);

[X2 Y2] = ginput2(2); % get two points from the user

 % estimate parameter vector (t)

%بردار پارامتر تخمین زده می شود.

Z  = [ X2′  Y2′ ; Y2′ -X2′ ; 1 1 0 0  ; 0 0 1 1 ]’; 

xp = [ X1 ; Y1 ];

t  = Z \ xp; % solve the linear system

a  = t(1); % = s cos(alpha)

b  = t(2); % = s sin(alpha)

tx = t(3);

ty = t(4);

 % construct transformation matrix (T)

%ساختن ماتریس انتقال

T = [a b tx ; -b a ty ; 0 0 1];

 % warp incoming corners to determine the size of the output image (in to out)

% پیچ و تاب گوشه و کنار ورودی برای تعیین اندازه تصویر خروجی(داخل به خارج)

cp = T*[ 1 1 w2 w2 ; 1 h2 1 h2 ; 1 1 1 1 ];

Xpr = min( [ cp(1,:) 0 ] ) : max( [cp(1,:) w1] ); % min x : max x

Ypr = min( [ cp(2,:) 0 ] ) : max( [cp(2,:) h1] ); % min y : max y

[Xp,Yp] = ndgrid(Xpr,Ypr);

[wp hp] = size(Xp); % = size(Yp)

% do backwards transform (from out to in)

X = T \ [ Xp(:) Yp(:) ones(wp*hp,1) ]’;  % warp

% re-sample pixel values with bilinear interpolation

%نمونه برداری از پیکسل ها با درونیابی با دو خط مستقیم

clear Ip;

xI = reshape( X(1,:),wp,hp)’;

yI = reshape( X(2,:),wp,hp)’;

Ip(:,:,1) = interp2(I2(:,:,1), xI, yI, ‘*bilinear’); % red

Ip(:,:,2) = interp2(I2(:,:,2), xI, yI, ‘*bilinear’); % green

Ip(:,:,3) = interp2(I2(:,:,3), xI, yI, ‘*bilinear’); % blue

% offset and copy original image into the warped image

%  افست و کپی تصویر اصلی به تصویر پیچیده شده.

offset =  -round( [ min( [ cp(1,:) 0 ] ) min( [ cp(2,:) 0 ] ) ] );

Ip(1+offset(2):h1+offset(2),1+offset(1):w1+offset(1),:) = double(I1(1:h1,1:w1,:));

% show the result

%نشان دادن نتیجه نهایی

figure; image(Ip/255); axis image;

title(‘mosaic image’);

ام فایل مجزا جهت تعریف تابع ginput2

function [X, Y] = ginput2(n)

X = [];

Y = [];

for i=1:n,

    [px py ] = ginput(1);

    X = [X ; px];

    Y = [Y ; py];

    plot( px, py, ‘r+’ );

    text_handle = text( px+5, py, num2str(i) );

    set(text_handle,’Color’,[1 1 1])

end

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *