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.
- Nalezení čtyř korespondujících bodů. Jsou to body které mají na obou obrazech stejnou polohu ve světových souřadnicích.
- 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 ů
ú
ű- Vytvoříme prostor pro složený obraz a do něj vložíme jeden z existujících.
- 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 |