Zpráva z předmětu PVI

Skládání obrazů kamer se stejnými (vnitřními ) parametry a stejné polohy

Postup:

Postup při skládání obrazů kamer se stejnými (vnitřními ) parametry a stejné polohy.

  1. Nalezení čtyř korespondujících bodů. Jsou to body které mají na obou obrazech stejnou polohu ve světových souřadnicích.
  2. Vypočteme z korespondujících bodů transformační matici H, která přepočítává souřadnice bodu v souřadnicích jednoho obrazu do souřadnic druhého obrazu.
    ai é
    ę
    ë
    ui
    vi
    1
    ů
    ú
    ű
    = H * é
    ę
    ë
    xi
    yi
    1
    ů
    ú
    ű
       pro každý bod i
    H = é
    ę
    ë
    h11 h12 h13
    h21 h22 h23
    h31 h32 h33
    ů
    ú
    ű
  3. Vytvoříme prostor pro složený obraz a do něj vložíme jeden z existujících.
  4. Pro každé místo ve složeném obrazu, kam by mohl přijít bod z transformujícího obrazu najdeme v transformujícím obrazu nejbližšího souseda a toho do složeného obrazu vykreslíme.

 

Zdrojový kód:

Okomentovaný zdroj. kód v Matlabu, který složí obr. panorama1.jpg a obr. panorama2.jpg do souřadnic obr. panorama2.jpg :

%natazeni souradnic ctyr bodu
load panoramap
%normalizace obrazku
im1 = double(rgb2gray(imread('panorama1.jpg')));
im2 = double(rgb2gray(imread('panorama2.jpg')));
im1 = im1/max(im1(:));
im2 = im2/max(im2(:));

%prevedeni bodu do snesitelnejsi formy
u1 = [I2(:,1)';I1(:,1)'];
u2 = [I2(:,2)';I1(:,2)'];

%vykresleni obrazku
figure
imshow(im1)
hold
plot(u1(2,:),u1(1,:),'*g')
figure
imshow(im2)
hold
plot(u2(2,:),u2(1,:),'*g')

%vytvoreni vetsiho obrazu (same nuly) a vlozeni do nej obrazek 1 do prostr. prave
poloviny
im = zeros(2*size(im1));
im([1:size(im1,1)]+size(im1,1)/2,[1:size(im1,2)]+size(im1,2))=im1;
u = u1 + [size(im1,1)/2;size(im1,2)]*ones(1,size(u1,2));
figure
imshow(im)
hold
plot(u(2,:),u(1,:),'*g')

%vytvoreni transformacni (homogenizacni) matice
H = uu2homog(u2,u);
%vypocet souradnic rohu druheho obrazku
v2 = [1 1 ; size(im2,1) 1 ;1 size(im2,2); size(im2)]';
%transformace do vetsiho obrazu a vykresleni
v = p2e(H * e2p(v2));
plot(v(2,:),v(1,:),'*r')
%vypocet minaminiho obdelnika obsahujici rohy 2. obrazku v vetsim
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')
%p2e transformace
%(x) (x/z)
%(y)=(y/z)
%(z) (1)
%

%vytvoreni souradnic kazdeho bodu v minimalnim obdelniku
[y,x] = meshgrid(b(3):b(4),b(1):b(2));
%prohozeni souradnic a vytoreni matice
%vse kvuli tomu, ze matlab zapisuje po sloupcich
uv = [x(:)';y(:)'];
%vytvoreni indexu( pro kazdy bod uv se najde nejblizsi soused ve (vetsi) im
%idx = round(uv(1,:))+round((uv(2,:)-1))*size(im,1);
%transformace uv do im2
%uv2 = p2e(inv(H) * e2p(uv));
%vypocet indexu v im2
%idx2 = round(uv2(1,:))+round((uv2(2,:)-1))*size(im2,1);
%oseknuti hodnoty, ktere se z min. obdelnika transformovali mimo im2
%ix2 = (uv2(1,:)>=1) & (uv2(1,:)<=size(im2,1)) & (uv2(2,:)>=1) &
(uv2(2,:)<=size(im2,2)-20);
%prirazeni bodu v im2 do im
%im(idx(ix2)) = im2(idx2(ix2));

% implementace téhož pomocí for cyklů

%drevorubecka metoda, mapuju z im2 do im, nezabyvam se tim kam mi ten bod %padne, ani
zda pokryju vsechny body

if 0 
for x=1:(size(im2,1)),
	for y=1:(size(im2,2)-10),
		xyim2=[x;y];
		xyim = p2e(H * e2p(xyim2));
		im(round(xyim(1)),round(xyim(2)))=im2(round(xyim2(1)),round(xyim2(2)));
	end
end
end

%zpracovani prikladu před drevorubeckou metodou s pouyitim for cyklu pro %vetsi
nazornost

xx=x(:,1);
yy=y(1,:);
for k=1:(size(xx,1)-1),
	for l=1:(size(yy,2)-1),
		xyim=[xx(k);yy(l)];
		xyim2 = p2e(inv(H) * e2p(xyim));
		if xyim2(2)<(size(im2,2)-20) & xyim2(2)>=1
			if xyim2(1) < size (im2,1)& xyim2(1)>=1
				%xyim = p2e(H * e2p(xyim2));
				im(round(xyim(1)),round(xyim(2)))=im2(round(xyim2(1)),round(xyim2(2)));

			end
		end
	end
end

figure
imshow(im)
return

 

Výsledky:

Vstupní obrázky:

panorama1.jpg (im1)

Panorama2.jpg (im2)

 

Výsledek postupu popsaného v části postup:

Výsledek2.jpg (im)

 

 

Výsledek dřevorubecké metody:

PRIKLAD2.jpg