【Stokes Vector】Stokes向量的计算以及模拟偏振的插值

Interpolating Polarization From DoFP Using Stokes Vector

2023-7-4 10:33:26

Polarization plays an important role in both industry and research. By using the different polarization properties, we could eliminate the highlight on the object’s surface, or detect the stress on it1. Some polarized camera sensors are manufactured, to cater for those applications. For example, division of time(DoT), division of amplitude(DoAM), division of aperture(DoAP) and recently, division of focal plane polarimeters(DoFP)2.

DoFP imaging sensors are compact and non-moving, which could capture polarized images in a snapshot. Sony IMX250MYR CMOS sensors are well-designed DoFP devices, which embed on-chip polarizers of different polarization angles for each pixel(Figure), but not on-glass polarizers, to reduce the crosstalk of polarized light.

在这里插入图片描述

In clockwise, the polarizers on IMX250MYR CMOS from left bottom to right bottom pixels are 13 5 ∘ 135^\circ 135, 9 0 ∘ 90^\circ 90, 4 5 ∘ 45^\circ 45, 0 ∘ 0^\circ 0, and four polarized photodiodes constitute a colour sensor module and four colour sensor modules constitute a colour pixel, which obeys the Bayer rule, is RGGB. After one shot using IMX250MYR, we could get a full-resolution Bayer image, and each Bayer pixel consists of four polarized responses, hence we could decompose the Bayer image into four half-resolution polarized images of each polarization angle. In recent years, many researchers worked so hard, aim to solve the problem of demosaicking the polarized sensor, because they want to fully use the resolution of the DoFP, but the response intensity of no-polarization at each pixel position is difficult to estimate.3 If we just use the polarized half-resolution image, we may not need to care about the demosaicking problem. However, in many scenarios, we may need to generate a virtual polarization filter. Before illustrating how to do that, we should know about the Stokes vector.

Stokes vector with Stokes parameters is a set of values that describe the polarization state(Wiki). The Stokes vector S S S can be defined as S ( I , Q , U , V ) S(I, Q, U, V) S(I,Q,U,V), where I I I is the total intensity of four polarized responses, Q Q Q and U U U present the linear polarization, while V V V presents the circular polarization state. In this case we only consider the linear polarization:
S = [ I Q C ] = [ S 0 S 1 S 2 ] = [ 1 2 ( I 0 + I 45 + I 90 + I 135 ) I 0 − I 90 I 45 − I 135 ] = [ I t o t I t o t P cos ⁡ ( 2 ϕ ) I t o t P sin ⁡ ( 2 ϕ ) ] \begin {align*} & S = \begin{bmatrix} I\\ Q\\ C \end{bmatrix} =\begin{bmatrix} S_0\\ S_1\\ S_2 \end{bmatrix} =\begin{bmatrix} \frac{1}{2} (I_0+I_{45}+I_{90}+I_{135})\\ I_0-I_{90}\\ I_{45}-I_{135} \end{bmatrix} =\begin{bmatrix} I_{tot}\\ I_{tot}\mathcal{P}\cos(2\phi)\\ I_{tot}\mathcal{P}\sin(2\phi) \end{bmatrix} \end {align*} S= IQC = S0S1S2 = 21(I0+I45+I90+I135)I0I90I45I135 = ItotItotPcos(2ϕ)ItotPsin(2ϕ)
Also, the we can use matrix to transform intensity to Stokes vector:
S = [ S 0 S 1 S 2 ] = [ 1 2 1 2 1 2 1 2 1 0 − 1 0 0 1 0 − 1 ] [ I 0 I 45 I 90 I 135 ] \begin {align*} & S = \begin{bmatrix} S_0\\ S_1\\ S_2 \end{bmatrix}= \begin{bmatrix} \frac{1}{2}& \frac{1}{2}& \frac{1}{2}& \frac{1}{2}\\ 1& 0& -1& 0\\ 0& 1& 0& -1 \end{bmatrix} \begin{bmatrix} I_0\\ I_{45}\\ I_{90}\\ I_{135} \end{bmatrix} \end {align*} S= S0S1S2 = 2110210121102101 I0I45I90I135
Where P \mathcal{P} P and ϕ \phi ϕ are Degree of Linear Polarization(DoLP) and Angle of Linear Polarization(AoLP), which defined as:
P = S 1 2 + S 2 2 S 0 , ϕ = 1 2 arctan ⁡ ( S 2 S 1 ) \begin {align*} & \mathcal{P}=\frac{\sqrt{S^2_1+S^2_2}}{S_0}, \phi=\frac{1}{2} \arctan(\frac{S_2}{S_1}) \end {align*} P=S0S12+S22 ,ϕ=21arctan(S1S2)
For the intensity of an arbitrary angle of polarization, we could use Müller matrix to interpolate, that is:
S θ = [ I t o t , θ I t o t , θ P cos ⁡ ( 2 ϕ ) I t o t , θ P sin ⁡ ( 2 ϕ ) ] = M θ S = 1 2 [ 1 cos ⁡ ( 2 θ ) sin ⁡ ( 2 θ ) cos ⁡ ( 2 θ ) cos ⁡ 2 ( 2 θ ) sin ⁡ ( 2 θ ) cos ⁡ ( 2 θ ) sin ⁡ ( 2 θ ) sin ⁡ ( 2 θ ) cos ⁡ ( 2 θ ) sin ⁡ 2 ( 2 θ ) ] [ 1 2 ( I 0 + I 45 + I 90 + I 135 ) I 0 − I 90 I 45 − I 135 ] \begin {align*} & S_{\theta} = \begin{bmatrix} I_{tot,\theta}\\ I_{tot,\theta}\mathcal{P}\cos(2\phi)\\ I_{tot,\theta}\mathcal{P}\sin(2\phi) \end{bmatrix} =M_{\theta}S=\frac{1}{2} \begin{bmatrix} 1& \cos(2\theta)& \sin(2\theta)\\ \cos(2\theta)& \cos^2(2\theta)& \sin(2\theta)\cos(2\theta)\\ \sin(2\theta)& \sin(2\theta)\cos(2\theta)& \sin^2(2\theta) \end{bmatrix} \begin{bmatrix} \frac{1}{2} (I_0+I_{45}+I_{90}+I_{135})\\ I_0-I_{90}\\ I_{45}-I_{135} \end{bmatrix} \end {align*} Sθ= Itot,θItot,θPcos(2ϕ)Itot,θPsin(2ϕ) =MθS=21 1cos(2θ)sin(2θ)cos(2θ)cos2(2θ)sin(2θ)cos(2θ)sin(2θ)sin(2θ)cos(2θ)sin2(2θ) 21(I0+I45+I90+I135)I0I90I45I135
The intensity we need it the first term of Stokes vector of tarthe get polarization angle, I t o t , θ I_{tot,\theta} Itot,θ. As definition, the Müller matrices for 13 5 ∘ 135^\circ 135, 9 0 ∘ 90^\circ 90, 4 5 ∘ 45^\circ 45, 0 ∘ 0^\circ 0 are:

{ M 0 = 1 2 [ 1 1 0 1 1 0 0 0 0 ] , M 90 = 1 2 [ 1 − 1 0 − 1 1 0 0 0 0 ] M 45 = 1 2 [ 1 0 1 0 0 0 1 0 1 ] , M 135 = 1 2 [ 1 0 − 1 0 0 0 − 1 0 1 ] \begin{align*} & \left\{\begin{matrix} M_0= \frac{1}{2} \begin{bmatrix} 1& 1& 0\\ 1& 1& 0\\ 0& 0& 0 \end{bmatrix},& M_{90}= \frac{1}{2} \begin{bmatrix} 1& -1& 0\\ -1& 1& 0\\ 0& 0& 0 \end{bmatrix}\\ M_{45}= \frac{1}{2} \begin{bmatrix} 1& 0& 1\\ 0& 0& 0\\ 1& 0& 1 \end{bmatrix},& M_{135}= \frac{1}{2} \begin{bmatrix} 1& 0& -1\\ 0& 0& 0\\ -1& 0& 1 \end{bmatrix} \end{matrix}\right. \end{align*} M0=21 110110000 ,M45=21 101000101 ,M90=21 110110000 M135=21 101000101

However, this is only in the ideal occasion. In such conditions, the cross-polarized light could be completely blocked. In reality, the polarizers usually are imperfect due to manufacture. The parallel and perpendicular transmittance become k 1 k_1 k1 and k 2 k_2 k2, then diattenuation is D = ( k 1 + k 2 ) / ( k 1 − k 2 ) D=(k_1+k_2)/(k_1-k_2) D=(k1+k2)/(k1k2), and extinction ratio is E R = k 1 / k 2 = ( D + 1 ) / ( D − 1 ) ER=k_1/k_2=(D+1)/(D-1) ER=k1/k2=(D+1)/(D1)3, and the imperfect Müller matrix become:
M θ = 1 2 [ k 1 + k 2 ( k 1 − k 2 ) cos ⁡ ( 2 θ ) ( k 1 − k 2 ) sin ⁡ ( 2 θ ) ( k 1 − k 2 ) cos ⁡ ( 2 θ ) ( k 1 + k 2 ) cos ⁡ 2 ( 2 θ ) + 2 k 1 k 2 sin ⁡ 2 ( 2 θ ) ( k 1 + k 2 − 2 k 1 k 2 ) sin ⁡ ( 2 θ ) cos ⁡ ( 2 θ ) ( k 1 − k 2 ) sin ⁡ ( 2 θ ) ( k 1 + k 2 − 2 k 1 k 2 ) sin ⁡ ( 2 θ ) cos ⁡ ( 2 θ ) ( k 1 + k 2 ) sin ⁡ 2 ( 2 θ ) + 2 k 1 k 2 cos ⁡ 2 ( 2 θ ) ] \begin{align*} & M_{\theta}=\frac{1}{2} \begin{bmatrix} k_1+k_2& (k_1-k_2)\cos(2\theta)& (k_1-k_2)\sin(2\theta)\\ (k_1-k_2)\cos(2\theta)& (k_1+k_2)\cos^2(2\theta)+2\sqrt{k_1k_2}\sin^2(2\theta)& (k_1+k_2-2\sqrt{k_1k_2})\sin(2\theta)\cos(2\theta)\\ (k_1-k_2)\sin(2\theta)& (k_1+k_2-2\sqrt{k_1k_2})\sin(2\theta)\cos(2\theta)& (k_1+k_2)\sin^2(2\theta)+2\sqrt{k_1k_2}\cos^2(2\theta) \end{bmatrix} \end{align*} Mθ=21 k1+k2(k1k2)cos(2θ)(k1k2)sin(2θ)(k1k2)cos(2θ)(k1+k2)cos2(2θ)+2k1k2 sin2(2θ)(k1+k22k1k2 )sin(2θ)cos(2θ)(k1k2)sin(2θ)(k1+k22k1k2 )sin(2θ)cos(2θ)(k1+k2)sin2(2θ)+2k1k2 cos2(2θ)

Code Example:

def PolarInterp_Stokes(angle):
    anlge_rec = angle/180 * np.pi
    height = polar_0.shape[0]
    width = polar_0.shape[1]
    
    polar_0_vec = np.double(np.reshape(polar_0, (1, height*width)))
    polar_45_vec = np.double(np.reshape(polar_45, (1, height*width)))
    polar_90_vec = np.double(np.reshape(polar_90, (1, height*width)))
    polar_135_vec = np.double(np.reshape(polar_135, (1, height*width)))
    
    S = np.zeros((3, height*width))
    S[0, :] = (1/2)*(polar_0_vec + polar_45_vec + polar_90_vec + polar_135_vec)
    S[1, :] =  polar_0_vec - polar_90_vec
    S[2, :] = polar_45_vec - polar_135_vec
    
    M_angle = np.zeros((3, 3))
    M_angle[0, 0] = 1; 
    M_angle[0, 1] = np.cos(2*anlge_rec) 
    M_angle[0, 2] = np.sin(2*anlge_rec) 
    M_angle[1, 0] = np.cos(2*anlge_rec) 
    M_angle[1, 1] = np.cos(2*anlge_rec) * np.cos(2*anlge_rec)
    M_angle[1, 2] = np.sin(2*anlge_rec) * np.cos(2*anlge_rec)
    M_angle[2, 0] = np.sin(2*anlge_rec)
    M_angle[2, 1] = np.sin(2*anlge_rec) * np.cos(2*anlge_rec)
    M_angle[2, 2] = np.sin(2*anlge_rec) * np.sin(2*anlge_rec)
    M_angle = (1/2)*M_angle
    
    S_angle = np.double(np.matmul(M_angle, S))
    S_angle[0,:][S_angle[0,:]<0] = 0
    S_angle[0,:][S_angle[0,:]>255] = 255
    Image_angle = np.uint8(np.reshape(S_angle[0, :], (height, width)))
    return Image_angle

Result(Cross polarization, Polarization angle from 0~180):
在这里插入图片描述

References


  1. chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://dce9ugryut4ao.cloudfront.net/LUCID-Going-Polarized-White-Paper.pdf ↩︎

  2. Zhang J, Luo H, Hui B, et al. Image interpolation for division of focal plane polarimeters with intensity correlation[J]. Optics express, 2016, 24(18): 20799-20807. ↩︎

  3. Qiu S, Fu Q, Wang C, et al. Linear polarization demosaicking for monochrome and colour polarization focal plane arrays[C]//Computer Graphics Forum. 2021, 40(6): 77-89. ↩︎ ↩︎

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
偏振Stokes矢量是用来描述偏振光的性质的一个工具,由爱尔兰物理学家乔治·加布里埃尔·斯托克斯(George Gabriel Stokes)提出。Stokes矢量可以通过对偏振光强度和偏振状态的测量得到。它是一个四维矢量,包括I、Q、U和V四个分量。 I代表总的偏振光强度,即光在垂直和平行于偏振方向上的强度之和。Q和U是描述线偏振光的分量,它们表示光在x轴方向和y轴方向上的偏振强度差异。V是描述圆偏振光的分量,它表示光在左旋和右旋偏振方向上的偏振强度差异。 偏振光的Stokes矢量计算可以通过使用偏振光的偏振分解器来实现。偏振分解器是一种光学装置,可以将偏振光分解为具有特定偏振状态的光,如线偏振和圆偏振。通过将待测的偏振光通过偏振分解器,并测量每个偏振状态下的光强度,就可以计算得到Stokes矢量的各个分量。 具体来说,将偏振光通过一个线偏振分解器,可以得到两个正交方向上的线偏振光,分别对应x轴和y轴方向。分别测量这两个方向上的光强度,就可以得到Q和U的分量。然后,将偏振光通过一个旋转的偏振分解器,可以得到两个旋转方向上的圆偏振光,分别对应左旋和右旋。同样测量这两个方向上的光强度,就可以得到V的分量。最后,将四个分量分别归一化,得到归一化的Stokes矢量。 通过Stokes矢量,我们可以得到偏振光的各种性质参数,如偏振度、偏振方向等,为进一步研究和应用偏振光提供了有力的工具和计算方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值