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ů.