鱼眼校正c语言算法,一种鱼眼图像逆向经纬映射的快速校正算法
1. 引言
魚眼鏡頭因其焦距短,視場大,拍攝圖像信息量大等優點,在安防監控、360度汽車成像儀等領域中得到廣泛應用。但魚眼鏡頭在獲得大視場的同時,會產生嚴重的圖像畸變問題 [1] [2] 。通過魚眼鏡頭成像得到的畸變圖像,從圖像中心向四周邊界的變形越來越嚴重,是一種視覺上無法接受且后續無法直接應用的非線性畸變圖像。
為滿足魚眼鏡頭圖像視覺效果及后續處理的需求,國內外大量學者針對魚眼圖像畸變的校正方法進行了深入研究,取得了有意義的研究成果。目前魚眼圖像畸變校正常用的兩種方法是基于投影變換模型的校正方法 [3] ,以及基于標定的校正方法 [4] [5] ,基于投影變換模型的校正方法需要進行迭代優化,計算量大,耗時長。基于標定的校正方法精確度高,但需要精確的標定設備,針對每一個特定的鏡頭,需要重新進行標定,針對無法獲取相機鏡頭參數的圖像會遇到問題。另外有些學者提出了一些不需要進行標定、運算簡單的畸變校正方法,如楊玲等 [6] 提出一種基于經緯映射的魚眼圖像校正方法,該方法不需要任何標定數據,可以快速糾正等角魚眼變形。楊夢寧 [7] 、魏利勝 [8] 和劉億靜 [9] 等在經緯法校正的基礎上進行了改進,都取得了一定的畸變校正效果,但上述這些方法都只注重對魚眼圖像校正效果的研究,沒有考慮算法的快速性和實時性問題。
由于魚眼校正的運算量較大,目前很多方法雖然能夠實現較好的校正效果,但是校正速度較慢,無法滿足實時性需求。因此本文在上述經緯映射魚眼圖像校正方法基礎上,提出了一種基于模板矩陣的魚眼鏡頭畸變圖像快速校正方法,以圖像中心點為分隔原點,將整個圖像區域分為上下左右四個像素區域,對目標圖像上的其中一個像素區域上的每一個坐標點,通過逆向經緯映射方法,找到其在待校正魚眼圖像上對應點的坐標,并將該對應點坐標值保存在一個坐標模板矩陣中。對目標圖像中剩下三個區域上的像素坐標點,只需建立其與第一個像素區域上坐標點之間的對應關系,就可直接從坐標模板矩陣中得到待校正魚眼圖像中對應點坐標,大大節省了計算量,提高了校正速度,完全滿足魚眼圖像校正的實時要求。
2. 魚眼圖像的正向經緯映射校正計算
一般情況下,魚眼圖像的經緯映射校正算法的基本步驟為 [10] :將需要校正的魚眼畸變圖像定為源圖像,規定校正后的圖像為目標圖像。首先計算圖像平面中源圖像的半徑R,將魚眼圖像像素坐標
(
x
′
,
y
′
) 一一映射到半徑為R的球面坐標
(
x
,
y
,
z
) ,計算球面坐標點
(
x
,
y
,
z
) 在球面上的經緯度坐標
(
λ
,
?
) ,再由經緯坐標在
[
0
,
π
] 上展開,得到校正后的目標圖像
(
u
′
,
v
′
) ,校正過程如圖1所示。
3. 魚眼圖像逆向經緯映射校正方法
采用從源圖像到目標圖像的映射變換,會導致目標圖上有大量的坐標像素點沒有值。因此本文采用逆向映射的坐標計算方法,從目標圖像出發,對每一個目標圖像的坐標點,反向計算其在源圖像上對應點的坐標 [6] [9] [11] [12] [13] (圖2)。
(a)
(b)
(c)
(d)
Figure 1. The chart of forward longitude and latitude correction for fish-eye image. (a) Coordinate of fish-eye image; (b) Coordinate of 3D spherical surface; (c) Coordinate of longitude and latitude; (d) Coordinate of corrected image
圖1. 魚眼圖像正向經緯映射校正示意圖。(a) 魚眼圖像坐標系;(b) 三維球面坐標系;(c) 經緯坐標系;(d) 校正圖像坐標系
Figure 2. The chart of inverse longitude and latitude projection transformation
圖2. 逆向經緯映射變換示意圖
魚眼圖像I的圖像半徑為R,中心點坐標為
(
x
0
,
y
0
) ,魚眼圖像上任一點
(
x
,
y
) 到中心的距離為
r
e 。魚眼圖像對應的目標圖像為D,中心點坐標為
(
u
0
,
v
0
) ,目標圖像上任一點
(
u
,
v
) 到中心的距離用
r
d 表示。以圖像中心點為坐標原點,對應點坐標可分別寫成下式:
魚眼圖像I:
x
′
=
x
?
x
0
,
y
′
=
y
?
y
0 ;
r
e
=
(
x
′
)
2
+
(
y
′
)
2
=
(
x
?
x
0
)
2
+
(
y
?
y
0
)
2
目標圖像D:
u
′
=
u
?
u
0
,
v
′
=
v
?
v
0 ;
r
d
=
(
u
′
)
2
+
(
v
′
)
2
=
(
u
?
u
0
)
2
+
(
v
?
v
0
)
2
從目標圖像開始,對每一個坐標點
(
u
′
,
v
′
) ,根據逆向經緯映射,找到每一個當前點
(
u
′
,
v
′
) 在魚眼圖像上對應的坐標點及對應數據值,計算得到目標圖像上當前點的數據值
D
(
u
′
,
v
′
) 。目標圖像D上任一坐標點
C
(
u
′
,
v
′
) ,與其在球面上對應經緯坐標點
C
′
(
λ
,
?
) 的關系式為:
λ
=
k
u
′ ,
?
=
k
v
′ ,其中
k
=
π
/
2
R (1)
根據經緯坐標點
C
′
(
λ
,
?
) ,以及視球面半徑R和視球面球心O,可求出其在視球面上對應點
B
(
x
,
y
,
z
) 的三維坐標:
{
x
=
R
?
cos
?
?
sin
λ
y
=
R
?
sin
?
z
=
R
?
cos
?
?
cos
λ (2)
通過視球面上點
B
(
x
,
y
,
z
) 的三維坐標,可以計算得出經過B點和球心的入射光線OB與Z軸的夾角
θ :
θ
=
arccos
(
z
/
R
)
=
arccos
(
cos
?
?
cos
λ
) (3)
本文中,采用等距投影模型來計算視球面上的點與魚眼圖像上對應點的坐標投影關系。由等距投影函數 [14] [15] ,魚眼圖像上像素點
(
x
′
,
y
′
) 到中心點的距離為
r
e
=
f
θ ,目標圖像中像素點到中心點的距離
滿足
tan
θ
=
r
d
f 。由此可計算得到:
r
e
=
f
?
tan
?
1
(
r
d
f
) (4)
魚眼圖像上點
(
x
′
,
y
′
) 到中心的連線與x軸的夾角為
α ,由此可導出魚眼圖像上與目標圖像對應點的坐標為:
{
α
=
arctan
(
y
x
)
=
arctan
(
sin
?
cos
?
?
sin
λ
)
x
′
=
r
e
?
cos
α
y
′
=
r
e
?
sin
α (5)
最后由所找到的魚眼圖像上的對應點
A
(
x
′
,
y
′
) ,通過插值計算得到目標圖像當前點處的數據值。對目標圖像中的每一個坐標點
(
u
′
,
v
′
) ,通過上述公式(1)~(5),找到其在源圖像中的對應坐標點
(
x
′
,
y
′
) ,利用雙線性插值方法計算得到
(
u
′
,
v
′
) 點的強度值,即可得到校正后的圖像。
4. 基于模板矩陣的逆向經緯映射快速計算方法
對目標圖像中的每一個坐標點,利用公式(1)~(5)并經過插值計算得到該點的強度數據值,計算量是非常大的。在此本文提出了一種基于模板矩陣的魚眼鏡頭畸變圖像快速校正方法,將目標圖像以圖像中心點作為分隔中心,平均分為上下左右四個像素區域,如圖3。對校正后的目標圖像上的其中一個區域上的每一個坐標點,通過逆向經緯映射方法,找到其在待校正魚眼圖像上對應點的坐標,并將該對應點坐標值保存在一個坐標的模板矩陣中。對目標圖像中剩下三個區域上的像素坐標點,只需建立其與第一個區域上坐標點之間的對應關系,就可直接從坐標模板矩陣中得到待校正魚眼圖像中對應點坐標。具體步驟為:
1) 分別以魚眼圖像和目標圖像的中心點為原點,各自建立坐標系,如圖3所示。以原點為中心,分別將兩個圖像區域分為四個象限①,②,③和④,兩個圖像上的四個部分分別對應。
2) 目標圖像上第一象限上一點
(
u
′
,
v
′
) 經過公式(1)~(5),反向映射得到
(
x
′
,
y
′
)
{
x
′
=
F
?
1
(
G
?
1
(
u
′
,
v
′
)
)
y
′
=
F
?
1
(
G
?
1
(
u
′
,
v
′
)
) (6)
3) 根據目標圖像第一象限上所有點,計算得到魚眼圖像上對應點的橫縱坐標,并存儲于模板矩陣[XX, YY]中:
X
X
(
u
′
,
v
′
)
=
x
′
Y
Y
(
u
′
,
v
′
)
=
y
′ (7)
4) 根據第①區域坐標點與②,③和④坐標點的對應關系,目標圖像上其它三個像素區域坐標點可通過它們對應的符號關系,直接在模板矩陣[XX、YY]通過正確的符號變換,找到與目標圖像上坐標點對應的魚眼圖像坐標點,符號變化式如下:
{
x
′
=
s
i
g
n
(
u
′
)
?
X
X
(
|
u
′
|
,
|
v
′
|
)
y
′
=
s
i
g
n
(
v
′
)
?
Y
Y
(
|
u
′
|
,
|
v
′
|
) (8)
5) 經過上述三步,即可快速完成對魚眼圖像坐標點的選取。
本文利用模板矩陣將校正程序中大量運算部分變為讀取坐標的模板矩陣數據,減小了運算量,顯著降低了運算時間。
5. 實驗結果與分析
分別利用正向經緯映射校正法,逆向經緯校正法和我們提出的基于模板矩陣的逆向經緯映射法對這些魚眼圖像進行了校正處理,部分圖像處理結果如圖4,圖5和圖6所示。
從圖中可以看出,我們的方法校正效果與逆向經緯方法校正效果一樣,就是運行速度更快。由于正向映射與逆向映射插值不同,逆向映射校正效果要比正向映射校正視覺效果好些。唯一的不足之處,就是因為經緯映射自身的原因,在經度上的校正效果要好于緯度上的校正效果,這也是后續我們算法需要繼續研究的。如圖4至圖6中,在魚眼圖中,豎立方向彎曲的柱子和房子,在結果圖中都得到了很好的校正,但橫向上彎曲的桿及磚塊等,在結果圖中卻變得更加彎曲。
表1中的數據為針對300 × 300,60 × 640及1080 × 1080三種不同分辨率大小的魚眼圖像,分別采用三種方法進行校正處理所用的時間,單位為毫秒。從中可以看出,對于相同分辨率大小的魚眼圖像,我們的快速算法比正向經緯映射校正和逆向經緯校正映射方法處理的時間少很多,假定正向經緯映射校正處理時間為O(N),則我們算法的時間只有O(N/2)。且隨著魚眼圖像分辨率的增大,這幾種方法在時間上的差異也相同。實驗結果證明,采用我們的快速算法,對于大小為300 × 300的魚眼圖像處理時間只需要0.01 s,視頻圖像處理幀率可達100幀/秒,即使是百萬像素級大小的圖像也能達到處理幀率為20幀/秒,因此本文提出的快速算法可以滿足視頻圖像校正處理的實時需求。
(a)
(b)
Figure 3. The chart for area partition of fish-eye image and object image. (a) Pixel area partition of fish-eye image; (b) Pixel area partition of object image
圖3. 魚眼圖像和目標圖像區域劃分示意圖。(a) 魚眼圖像像素區域劃分;(b) 目標眼圖像像素區域劃分
(a)
(b)
(c)
(d)
Figure 4. Correction results of 300 × 300 fish-eye image. (a) Fish-eye image; (b) Result of forward latitude-longitude correction; (c) Result of inverse latitude-longitude correction; (d) Result of the proposed method
圖4. 300 × 300魚眼圖像及校正結果。(a) 魚眼圖像;(b) 正向經緯校正結果;(c) 逆向經緯校正結果;(d) 我們方法校正結果
(a)
(b)
(c)
(d)
Figure 5. Correction results of 640 × 640 fish-eye image. (a) Fish-eye image; (b) Result of forward latitude-longitude correction; (c) Result of inverse latitude-longitude correction; (d) Result of the proposed method
圖5. 640 × 640魚眼圖像及校正結果。(a) 魚眼圖像;(b) 正向經緯校正結果;(c) 逆向經緯校正結果;(d) 我們方法校正結果
Table 1. The correction time of three different methods (ms)
表1. 三種不同校正算法所用時間(ms)
(a)
(b)
(c)
(d)
Figure 6. Correction results of 1080 × 1080 fish-eye image. (a) Fish-eye image; (b) Result of forward latitude-longitude correction; (c) Result of inverse latitude-longitude correction; (d) Result of the proposed method
圖6. 1080 × 1080魚眼圖像及校正結果。(a) 魚眼圖像;(b) 正向經緯校正結果;(c) 逆向經緯校正結果;(d) 我們方法校正結果
6. 結論
針對魚眼圖像校正的實時性問題,本文提出了一種基于模板矩陣,采用逆向經緯映射進行魚眼畸變圖像的快速校正方法。分別將源圖像和目標圖像分成四個對稱區域,只需計算其中一個區域上兩幅圖像之間的經緯映射值,其它三個區域的經緯映射值都可以根據其與第一區域之間的坐標關系來得到,節省了大量數據的計算時間。對不同相機拍攝的各種不同分辨率魚眼圖像進行處理,實驗結果表明本文提出的校正方法耗時少,速度快,具有較強的實用性。
基金項目
國家自然科學基金(61305039),國家自然科學基金重點項目(61433007)資助項目。
總結
以上是生活随笔為你收集整理的鱼眼校正c语言算法,一种鱼眼图像逆向经纬映射的快速校正算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奇文|意识如何演化?机器何时有自我意识?
- 下一篇: 使用Three.js实现炫酷的赛博朋克风