توضیحات روش اول:
برای به هم پیوستن دو ،سه و یا اتصال تصاویر بیشتر کاربرد دارد مثلا در برنامه اول قابلیت اتصال دو تصویر را به هم دارد.
در همین برنامه با تغییر کوچکی در ساختار برنامه و استفاده از تابعی مشابه برنامه اصلی می توان از آن برای اتصال تصاویر بیشتری استفاده کرد ، و این تعداد محدودیتی ندارد.
که در واقع از همون ساختار برنامه اول استفاده شده است اما در کنار آن از یه تابع مشابه با برنامه اصلی استفاده شده است finall(Ip)
این تابع در واقع نتیجه خروجی که اتصال تصاویر در مرحله قبل می باشد به عنوان ورودی استفاده می کند و به تکه بعدی اتصال می دهد و این تابع در ساختار برنامه اصلی فراخوانی می شود.
تمام مراحل در ادامه نمایش داده شده است.
% load input images
clc;clear;close all;
I1 = double(imread('D:\stitch\barname1\left.jpg'));
[h1 w1 d1] = size(I1);
I2 = double(imread('D:\stitch\barname1\right.jpg'));
[h2 w2 d2] = size(I2);
در این برنامه دو تکه تصویر رو به هم متصل می کنیم.
در گام اول هر دوتکه تصویر توسط دستور imread خوانده می شود.
% 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
در این مرحله تصویر اول در figure نمایش داده می شود، و دونقطه از کاربر گرفته می شود که این کار توسط تابع ginput2 انجام می شود.
سپس به طور مشابه دو نقطه دیگر توسط این تابع از کاربر گرفته می شود.
%بردار پارامتر تخمین زده می شود.
%ساختن ماتریس انتقال
% پیچ و تاب گوشه و کنار ورودی برای تعیین اندازه تصویر خروجی(داخل به خارج)
%نمونه برداری از پیکسل ها با درونیابی با دو خط مستقیم
% افست و کپی تصویر اصلی به تصویر پیچیده شده.
%نشان دادن نتیجه نهایی
% 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
دانلود برنامه