廣角鏡頭,甚至超廣角鏡頭已經成為了現在手機的標配,這樣的手機能夠拍攝出寬廣的視角,還能夠在合拍時拍下更多的人物。
比如最新的iPhone13 Pro就有一顆26mm焦距的廣角鏡頭,還有一顆13mm焦距的超廣角鏡頭。
事實上,自2019年起,很多手機攝像頭的FOV就已經超過100度了
然而,廣角鏡頭也會帶來副作用,如下圖紅框所示,本來是直線的牆頂卻變成了曲線
下面這個場景更加明顯,整個地面和大樓都變成彎曲的了
另外,廣角鏡頭拍攝的畫面在四角處還會出現拉伸現象,比如這兩位姑娘的腳就被明顯拉長了。有時候攝影師利用這種特性來拍攝大長腿,但如果構圖不恰當也會導致比較詭異的現象。
以上兩種現象,分別是由於鏡頭的物理畸變和透視畸變導致的。今天我們來看看兩種畸變產生的原因,以及解決方案。
一. 鏡頭畸變
在以前的文章 29. 小孔相機 和 31. 鏡頭、曝光,以及對焦(上) 中,我們都假設整個成像符合小孔成像模型
然而,真實的相機的鏡頭並不能完美的遵循小孔成像模型。
在製造過程中,透鏡的實際曲面和理想曲面之間存在一定的誤差,這種誤差會改變光的折射方向,使得成像點的位置發生偏差,通常這會導致“徑向畸變”
根據透鏡曲面的不同情況,徑向畸變會導致畫面出現桶形失真或枕形失真。
與此同時,實際相機通常採用多個透鏡組成鏡頭組,各透鏡中心與光軸是否重合、鏡片與光軸是否垂直、各鏡片沿光軸方向的位置偏差等都會使光線偏離理論路徑。雖然透鏡的組合可以相互抵消一些性質相反的非線性畸變,但是也會疊加一些性質相同的非線性畸變。通常,這會導致“切向畸變”
實際成像過程中,這兩種畸變通常混雜在一起,尤其是廣角鏡頭組很難避免它們。如下圖所示:
那麼如何去除鏡頭畸變呢?
為了去除它們,我們需要嚴格的用數學公式來表述 實際成像點和理想成像點之間的位置關係。
先把小孔成像模型用幾何表示如下:
可見對於三維空間中的座標[X, Y, D]T, 是比較容易求出其理想成像點在相機座標系中的座標的,我們令其理想投影點為 [xc, yc],這裡,下標c代表corrected(這裡是近似認為校正後的座標既是按照理想小孔成像模型的投影座標)
由於實際相機會有畸變,所以我們把帶畸變的投影點表示為 [xd, yd] ,這是和理想投影點不一樣的座標,d代表distorted。這兩個位置的關係可以近似表示如下。這裡展示的是3階模型,更復雜的鏡頭畸變校正可以用到更高階的模型,比如OpenCV裡面可以用到6階模型:
這樣我們就建立了在相機座標系下,校正前和校正後座標之間的關係。由於我們是對影像上的畫素進行操作,還需要將相機座標轉換為畫素座標,求取畫素座標之間的關係,這需要用到影像的內引數(參見 手機中的計算攝影1-人像模式(雙攝虛化) )
這樣我們最終可建立[uc, vc]和[ud, vd]之間的一一對應關係,這種關係可以用一張兩通道的圖來表述,兩個通道分別表示特定校正後畫素對應的校正前的u座標和v座標。通常,計算出的座標值[ud, vd]是浮點值,因此需要用到插值演算法來實現真正的影像變換。
OpenCV的undistortImage函式的幫助檔案裡也講得很清楚,它透過相機內參計算出畸變校正的變換圖,接著呼叫remap函式來進行從畸變影像到校正後影像的插值變化。
透過這種方法去除鏡頭的徑向畸變和切向畸變後,畫面中的直線會被校直,如下圖所示:
採用類似原理甚至可以對魚眼鏡頭影像進行畸變校正:
然而,雖然這個方案能很好的校直直線,卻也帶來了一定副作用。如下圖紅框所示的腿部,影像出現了異常的拉伸現象:
這是因為實際拍攝的場景中,除了鏡頭畸變導致的畫面形變外,還有一種特殊的畸變: 透視畸變
二. 透視投影和透視畸變
讓我們再看看小孔成像模型,可以很容易發現一個物體所成像的尺寸與其距離鏡頭的距離(物距)成反比,即所謂的 近大遠小
當拍攝一個目標時,只要它的表面存在物距上的差異,那麼這個物體上每一個物距不同的區域性區域都會有不同的成像放大倍率。這種現象不管是透過鏡頭成像,還是小孔成像都是存在的,是固有的屬性,這裡的投影模型就叫做透視投影,其產生的效應我稱之為透視效應。
人們有時利用透視效應來拍攝有趣的攝影作品:
透視投影還會使得三維空間中的平行線在畫面中相交,其交點稱作為消失點。
藝術家早就會使用透視技術,來突出主體了,例如下面這幅畫是荷蘭著名畫家約翰內斯·維米爾(Johannes Vermeer)的作品 鋼琴課。畫家利用透視效應,將主人公安排在了整個畫面幾條直線的消失點上,從而實現了突出主體的作用。
然而,透視效應也會導致畫面的形變,我們看到拍攝同一個姑娘時,短焦鏡頭(廣角鏡頭)出現了強烈的透視畸變。這是因為為了拍出同樣尺寸的像,短焦鏡頭拍攝時物距更近,因為透視效應的 近大遠小法則,這種形變顯得更加明顯。尤其是在近距離拍攝時,人臉上鼻子相比臉側面距離鏡頭更近,所以鼻子成像時放大得更大,於是人臉就顯得更加詭異了。
除了上面這種因為近距離拍攝導致的形變,透視效應還會導致遠離相機中心的物體被拉伸,比如下面這張用iPhone13 Mini的廣角鏡頭拍攝的照片。相比起上面因為近距離拍攝導致的形變,這種邊緣物體被拉伸的現象是我們更常見的情況。
那麼,有沒有辦法同時去除鏡頭畸變和透視效應導致的邊緣形變呢?就像下面這樣:
這就是下一節的內容。
三. 同時去除鏡頭畸變和透視畸變
在用手機照片時,人們拍的最多的就是人像照,不管是單人的,還是多人合照,正如上面的內容所講,廣角鏡頭帶來了不必要的副作用,尤其是影像邊角處的人像被拉扯的現象,這種畸變會在我們強行校直直線,變為透視投影后更加明顯。
為了解決人像的這種拉扯現象,以前的方法是利用球極投影(Stereographic projection)或者墨卡託投影(Mercator projection)來對影像進行進一步處理。
幾種不同的投影方式的比較
當對畫面採用這兩種投影時,能一定程度上恢復畫面邊角頭部、臉部的形變,但也會導致背景直線重新彎曲,如下圖所示。
以前有很多研究者研究過這個問題,但都沒有得到理想的效果。比如[Zorin and Barr 1995]提出的方案,雖然修復了人臉的扭曲,但是也導致了牆面、桌面、顯示器等其他物體的扭曲
還有[Carroll et al. 2009]提出的透過最佳化全域性一致性最小化感知失真的方案,以及[Tehrani et al. 2016]提出的透過引入虛擬的相機視角的方案。但這些方案需要手動操作,例如標註突出的邊緣或要保留的重要區域,而且有時候無法徹底解決問題。
有沒有一種自動的、不需人為干預,還能很好的去除影像中各種畸變的方法呢?有的,這就是我要介紹的這篇文章
這是臺灣省的三位才俊施易昌, 賴威昇及梁家愷在2019年發表的文章。他們的想法很直接:既然透視畸變矯正能夠校直影像中的直線,而球極投影又能夠恢復人臉的形狀。那麼不如先對影像做人臉分割,對非人臉的背景區域計算透視畸變的校正map,再對人臉部分做球極投影的校正map,然後把兩部分的變換map整合到一起,用最終的變換圖來對影像進行插值變換:
聽起來這是個清晰、直接的想法,然而做起來卻很不容易。如下面右圖所示,如果簡單的把兩個map融合到一起,只會得到很糟糕的結果
所以作者認為,應該把變換map的求解看做是一個最最佳化的問題,透過求解這個最最佳化問題得到最佳的map,然後利用它對影像進行插值變換,這樣才能得到最佳的結果。
最最佳化總是需要達到某些預期目標的,那麼此處的目標是什麼呢?我們一起來直觀的想一想:
- 首先,校正後的影像在人臉部分是非常接近球極投影的
- 越是靠近影像中心的人臉,越接近透視投影本來的樣子
- 人臉在變換前後不應該有異常的尺度變化
- 經過透視投影校直的直線,不應該被球極投影重新變彎曲
因此,作者首先將問題用數學公式表達如下:
這裡面,{vi*}是指map中所有的2維向量的集合, vi是第i個畫素對應的源畫素座標,而Et則是一個目標函式,透過使Et最小化,就可以求得最佳變換map {vi*}
Et由多專案標函式組成。這裡面,首先是人臉目標項Ef , 它是所有人臉處的目標函式值Es,k 之和,正如我們上面的直觀感覺,這個目標函式約束了下面幾個目標:
- 校正後的影像在人臉部分是非常接近球極投影的
- 越是靠近影像中心的人臉,越接近透視投影本來的樣子
- 人臉在變換前後不應該有異常的尺度變化
作者演示了人臉項的作用,當沒有這一專案標函式的約束時,所得到的影像有明顯的人臉扭曲變形,而加入這一項後結果有很大的改善。
接著需要約束直線的彎曲,目標函式如下。這裡用了叉積來約束變換前後直線的夾角,表明允許直線發生平移,但避免發生大的彎曲
然後還要加上1項,約束變換map的區域性平滑性
作者也演示了上面這兩個約束函式的作用,可見它們很好的保持了直線,而且沒有引入副作用。
為了避免在影像邊緣處出現異常的扭曲,還需要在中間計算時擴充影像(透過Padding),並對擴充影像做一些特殊的約束(記為Ea ),並在最後一步裁減掉多餘的部分。這種邊界的約束也帶來了收益:
所以讓我們回顧下上面講的最最佳化式子:
這裡的Et就是上述幾種目標函式的加權和:
透過使得Et最小化,就可以求出最佳的變換矩陣,這個過程可以圖示如下,通常只需要兩三個迭代就可以收斂:
作者在大量不同的特質的影像上做了驗證,效果非常好。讓我們多看一些作者給出的演示下效果吧
四. 實現、效能,以及缺陷
在論文中,作者提到他們將這個演算法在PC及高通的SDM845平臺上都做了實現,其關鍵的最最佳化過程用的是Ceres solver這個庫,最終插值演算法用的是高精度的Lanczos取樣演算法。他們將鏡頭畸變和透視畸變的校正整合到同一個map中進行,對於1200萬畫素的輸入影像, 能夠在920ms內完成對所有的畸變校正,並且實際部署到了Google的Pixel 3手機中。一篇論文,不僅僅在理論上有突破點,而且還能實際落地到產品中,有高度的可用性,確實讓人佩服!
雖然作者展示的結果已經足夠驚豔了,但也並不是完美無缺。作者也提出,它是需要人臉Mask作為輸入的,如果沒有成功檢測、分割到人臉,那麼演算法就會出錯:
另外演算法只對人臉部分進行校正,人的身體還是保持不變,這樣在校正後有時會出現頭小身大的詭異現象:
事實上,我們還發現該演算法即便提供了足夠的人臉Mask,該演算法還是可能導致背景線條出現彎曲,如下圖所示:
或是不能對人像做到足夠好的修復:
在我看來,它最大的問題還是速度太慢。可能你覺得920ms已經夠快了,但事實上對於今天的拍照手機來說,這是一個很慢的速度——使用者不能忍受,因而手機生產廠商也無法忍受——大家都希望最好是在更短的時間內,例如幾十毫秒內完成整個運算。
有沒有能夠解決上述效果問題,還能夠跑得飛快的演算法呢?當然是有的,事實上我的團隊已經在手機上實現了效果更好,而且 只需要不到100毫秒就能夠完成整個過程的廣角畸變校正演算法,並且已經在很多客戶專案中部署了。而這一部分的基礎原理,我將在下一篇文章中為你介紹。
五. 總結
今天我首先為你介紹了鏡頭畸變,以及它引起的直線彎曲現象。然後講述了鏡頭畸變的兩種原因——徑向畸變和切向畸變,並給出了去除這兩種畸變的完整過程。接著我介紹了透視投影的應用,以及它導致的邊角拉伸現象。我還花了較大篇幅,介紹了三位寶島才俊的去除透視畸變的論文。事實上,我們正是基於這篇論文的思想加以改進,實際開發了相關的產品,並已經部署到了很多客戶手機中,當然我們已經完全採用了不同的方法。
如同上面的論文中最後所說,廣角鏡頭畸變校正這個方向其實背後還有一個更加本質和深入的問題: 在透視投影下,是影像中的哪些特徵使得我們人類視覺系統感知到了畸變呢?有沒有某種方式來客觀定量的描述這種畸變呢?這其實牽涉到了影像質量的定量評價這個領域了。我希望下一篇文章中,能夠對此給出一些解答
獨家重磅課程!
1、視覺SLAM必備基礎 太捲了!聽說學懂ORB-SLAM2課程第3期可全額退款?敢不敢來挑戰?
2、 VINS:Mono+Fusion SLAM面試官:看你簡歷上寫精通VINS,麻煩現場手推一下預積分!
3、VIO課程: VIO最佳開源演算法:ORB-SLAM3超全解析課程重磅升級!
4、影像三維重建課程(第2期): 視覺幾何三維重建教程(第2期):稠密重建,曲面重建,點雲融合,紋理貼圖
5、 重磅來襲!基於LiDAR的多感測器融合SLAM 系列教程:LOAM、LeGO-LOAM、LIO-SAM
6、系統全面的相機標定課程: 單目/魚眼/雙目/陣列 相機標定:原理與實戰
7、深度學習三維重建課程: 基於深度學習的三維重建學習路線
8、鐳射定位+建圖課程: 鐳射SLAM框架Cartographer課程90+影片全部上線!適合服務機器人!