圓柱投影就是將一張二維的圖像投影到三維的圓柱體上,不過在顯示圖像的時候依然是以二維的形式給出。
投影最重要的步驟就是計算投影變換公式,和圖像旋轉類似,只要得到變換公式,再依照公式進行代碼編寫就很容易了。
這里就不寫投影變換公式的推導過程了,直接給出變換公式。公式分為正變換和反變換,編程時,反變換公式通常更有用。
正變換公式如下:
其中,x,y為原圖的坐標,x',y'為變換后圖像的坐標,W,H為原圖的寬和高,f=W/(2*tan(hfOV/2)),這里hfOV為相機水平視角,我們通過設置這個參數來實現不同的投影效果,hfOV取值為(0,pi)之間。
反變換公式可以通過正變換公式推導出來,其實在程序中已經寫出來了。
下面是hfOV為pi/2時得到的變換結果:
原圖:
處理后結果:
matlab代碼如下:
clear all; close all;clc; img=imread('lena.jpg'); [h,w]=size(img); hfOV=pi/2; %可取區間為(0,pi) f=w/(2*tan(hfOV/2)); newh=h; %變換后高度不變 neww=floor(f*atan((w-w/2)/f)+f*atan(w/(2*f))); %通過正變換公式計算最大寬度 imgn=zeros(newh,neww); for i=1:newh for j=1:neww %反變換公式的應用 x=floor(f*tan(j/f-atan(w/(2*f)))+w/2); y=floor((i-h/2)*sqrt((x-w/2)^2+f^2)/f+h/2); if x>=1 && x<=w && y>=1 && y<=h imgn(i,j)=img(y,x); end end end imshow(img); figure; imshow(imgn,[]);