Laboratorní práce z PVI

 

Zadání:

         Vytvořte jeden obrázek ze dvou, na nichž jsou dány 4 společné body a fotoaparát se nesměl posunout pouze pootočit.

 

Popis řešení:

            Teorie ze které jsem vycházel byla přednesená na přednáškách. Jak jsem se dozvěděl z přednášek musí existovat transformace taková, aby dané dva obrázky šli transformovat do jedné souřadné soustavy se stejným měřítkem a stačí k tomu pouze 4 spolu související body.

            Nyní se pokusím dobře okomentovat můj program.

Nejprve nahraji body které spolu na obou fotografiích souvisi

load panoramap

Poté nahraji obe fotografie a to v šedi pro jednoduší výpočet

im1 = double(rgb2gray(imread('panorama1.jpg')));                 

im2 = double(rgb2gray(imread('panorama2.jpg')));                 

nyní normuji obrázky aby byli v intervalu 0-1

im1 = im1/max(im1(:));                                                                                              

im2 = im2/max(im2(:));

teď pouze přerovnání matice bodů

u1  = [I2(:,1)';I1(:,1)'];                                                                                              

u2  = [I2(:,2)';I1(:,2)'];

vykreslení obrázků a vyznačení souvisejících bodů

figure


imshow(im1)

hold

plot(u1(2,:),u1(1,:),'*g')                                                          

figure

imshow(im2)                                                                                                             

hold

plot(u2(2,:),u2(1,:),'*g')


vytvoření potřebné oblasti pro spojení obou obrázků

im = zeros(2*size(im1));

posunutí prvního obrázku doprava doprostřed

im([1:size(im1,1)]+size(im1,1)/2,[1:size(im1,2)]+size(im1,2))=im1;

souradnice prepocteme na globalni souřadnice

u  = u1 + [size(im1,1)/2;size(im1,2)]*ones(1,size(u1,2));

vykresleni velkého obrázku, který zatím obsahuje pouze první obrázek

figure

imshow(im)

hold

vykreslení bodů

plot(u(2,:),u(1,:),'*g')

vypočtení transformační matice

H  = uu2homog(u2,u);

okraje obr. 2

v2 = [1 1 ; size(im2,1) 1 ;1 size(im2,2); size(im2)]';

transformace rohových (okrajových) bodu

v  = p2e(H * e2p(v2));

a následné vykreslení

plot(v(2,:),v(1,:),'*r')

vypočtení min obdélníkové oblasti a vykreslení

b  = [floor(min(v')) ceil(max(v'))];

b  = b([1 3 2 4]);

bp = [b([1 3])' b([1 4])' b([2 4])' b([2 3])'];

plot(bp(2,[1:4 1]),bp(1,[1:4 1]),'m')

[y,x]         = meshgrid(b(3):b(4),b(1):b(2));

uv            = [x(:)';y(:)'];


přeindexování do velkého obrázku

idx           = round(uv(1,:))+round((uv(2,:)-1))*size(im,1);

transformace

uv2           = p2e(inv(H) * e2p(uv));

přeindexování do druhého obrázku

idx2          = round(uv2(1,:))+ round((uv2(2,:)-1))*size(im2,1);

maska 0 a 1, -20 vyhodi cerny pruh

ix2           = (uv2(1,:)>=1) & (uv2(1,:)<=size(im2,1)) & (uv2(2,:)>=1) &

(uv2(2,:)<=size(im2,2)-20);

vložení druhého obrázku do velkého a vykreslení výsledku

im(idx(ix2))  = im2(idx2(ix2));                                                                       

figure

imshow(im)

 

 

 

 


 

 


Závěr

            Na tomto posledním je vidět že se fotoaparát nepatrně pohnul nebo si neodpovídají přesně ty body co byli označeny. Je vidět malý přechod hlavně na trávníku. Jinak úloha byla zajímavá a člověk si ověřil, že to není zcela triviální spojit inteligentně dva obrázky. A zrovna v našem případě si myslím, že by se slušelo ještě nějak aproximovat nebo použít více bodů spolu souvisejících. To by ovšem přineslo více problémů, hlavně v aproximaci transformace, ovšem mohli bychom dosáhnou lepších vizuálních výsledků.