目录
效果原理完整代码
效果
将一张拍摄图片进行球面投影,效果如图
原理
由于opencv-python中并没有给出球面投影函数,只能自己手写一套算法,以下是此算法的基本原理:
首先假设原始图片位于一个球体表面,因此拍摄的图片只能反映x、y二维平面的几何关系,不能体现z方向的几何关系,因此需要假设图片位于一个半径为r的球体表面的下半部分,如图:
假设P点为光源,建立一个从P点(0,0,h)到球面上图片上的任意一点P2(x,y,z)映射到平面α的映射关系如图:
可得,P3 = P + k(P2 - P),将P3 = (px,py,pz)带入,得 k = (pz - h)/(z - h) px = kx py = ky
在上式中,x、y均能从原始图片中直接获得,z则用x、y和假设出来得球半径r来表示:
将上述公式写在代码中,完整代码如下
完整代码
import cv2
import numpy
as np
img
= cv2
.imread
('ori.jpg')
rows
= img
.shape
[0]
cols
= img
.shape
[1]
blank
= np
.zeros_like
(img
)
center_x
= int(rows
/ 2)
center_y
= int(cols
/ 2)
r
= int(((rows
**2+cols
**2)**0.5)/2)+20
pz
= r
for x
in range(rows
):
ox
= x
x
= x
- center_x
for y
in range(cols
):
oy
= y
y
= y
- center_y
z
= (r
*r
- x
*x
- y
*y
)**0.5
k
= (pz
- 2*r
)/(z
- 2*r
)
px
= int(k
*x
)
py
= int(k
*y
)
px
= px
+ center_x
py
= py
+ center_y
blank
[px
, py
, :] = img
[ox
, oy
,:]
cv2
.imwrite
('out.jpg',blank
)