【Octave】柱面投影簡析


========================我是分割線==========================

在做全景拼接的時候,為了保持圖片中的空間約束與視覺的一致性,需要做一定的預處理,可以是球面投影,柱面投影等。

如果僅僅是做水平方向的拼接,則做柱狀投影就好了

一. 原理

  把平面圖像投影到圓柱的曲面上。

  如下圖,四邊形GHEF表示待處理原圖,投影之后,變成曲面JDILCK(黃色點標注)

  

  俯視圖如下,DCE為待處理圖像平面,FCG為投影所得曲面。

    

      

   設,原圖像寬W,高H,角度FOG為相機視場角度α(一般為45°,即PI/4),圓形半徑(焦距)f 有tan 1/2α = W / (2 * f), 則有f = W / (2 * tan(α/2))

      依次推算出,目標圖像的寬(曲線FCG長)W‘ = f * α, 目標圖像高H’不變, H‘ = H

     第一種推算:以圖像像素原始坐標計算(即,左上角為原點)

   

     公式如下:

   

   第二種推算:設置圖像原點為(W/2, H/2),用以簡化計算步驟

  

二. Octave實現

  

I = imread('images/doge.bmp');
[height, width, depth] = size(I);
A = I;
centerX = width / 2;
centerY = height / 2;
% alpha = pi / 4;
f = width / (2 * tan(pi/4/2));
for i = 1 : width,
	for j = 1 : height,
		theta = asin((i - centerX) / f);
		pointX = int32(f * tan((i - centerX) / f) + centerX);
		pointY = int32((j - centerY) / cos(theta) + centerY);
		for k = 1 : depth,
			if pointX >= 1 && pointX <= width && pointY >= 1 && pointY <= height,
				A(j, i, k) = I(pointY, pointX, k);
			else
				A(j, i, k) = 0;
			end;
		end;
	end;
end;
subplot(1, 2, 1);
imshow(I);
subplot(1, 2, 2);
imshow(A);
Octave & Matlab代碼

 

三. 效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM