What is a Jones vector and a polarization ellipse?

How to visualize the polarimetric information?

Elise Colin
5 min readFeb 10, 2024

Coherent wave and the concept of polarization

The notion of coherence of a wave is a fundamental concept in physics, especially in the fields of optics, electromagnetism, and quantum mechanics. Natural light is not coherent: it comprises multiple frequencies (or wavelengths, or colors).

To simplify, one could say that a light source is coherent when it is monochromatic (a single frequency) AND the various waves that compose it oscillate in phase.

This means that the phase relationship between the waves at different points in space and at different moments must be well-defined and predictable.

The polarization of a wave is a property that describes the orientation of the electric field vector in space during its propagation.

Horizontal and Vertical Polarization
Elliptical polarization

The Jones vector

The Jones vector is a mathematical tool used in optics to represent the polarization of a plane and monochromatic light wave. It provides a complete description of the light’s polarization state in terms of the amplitude and phase of the electric field components. The formalism of Jones vectors is limited to perfectly coherent light waves, which are then “completely polarized,” as opposed to the case of partially polarized waves for which another formalism is required to account for the randomness of the polarization.

Form and Interpretation

The Jones vector is expressed as a column vector containing the complex components of the electric field in two perpendicular directions (usually denoted as x and y) in the plane perpendicular to the direction of the wave’s propagation. Mathematically, it is written as:

where Ex and Ey​ are the amplitudes of the electric field components in the x and y directions, respectively, and can include a phase, meaning they can be expressed in the form Ex=∣Ex∣exp(i φx), and Ey​=∣Ey​∣exp(i φy​)​, φx​ and φy​ are the phase arguments of each component.

Examples of Polarization States

  1. Linear polarization : For a wave linearly polarized along the x-axis, the Jones vector could be (1,0), and for a wave linearly along the y-axis, the Jones vector is (0,1).
  2. Right and Left circular polarizations : The Jones vectors are given by (1,i) and (1,-i): the x and y components have equal amplitudes but the y component is delayed (respectively advanced) in phase by π/2 radians (90°) relative to the x component.

The polarisation ellipse

This Jones vector describes an ellipse. Let’s see how we can calculate the parameters of this ellipse, from the complex components (Ex,Ey​) of a Jones vector:

If we call Ψ the orientation of the ellipse, and epsilon its eccentricity, then:

S is the magnitude of the Jones vector. It is also the square root of the SPAN, that is the total intensity |Ex|**2+|Ey|**2

In Python, obtaining these ellipse parameters from a complex Jones vector (Ex,Ey) can be coded as follows:

def Jones2EllipseParameters(Ex,Ey):
# Calculate ellipse orientation angle
a = np.abs(Ex)**2 - np.abs(Ey)**2
b = 2 * np.real(Ex * np.conjugate(Ey))
OrientationAngle = np.arctan2(b,a)

xhi=np.angle(np.conj(Ey)*Ex)
sin2Epsilon=2*np.abs(Ex)*np.abs(Ey)/(np.abs(Ex)**2+np.abs(Ey)**2)*np.sin(xhi)

S=np.sqrt(np.abs(Ex)**2+np.abs(Ey)**2)
return OrientationAngle, sin2Epsilon, S

Application to a colored representation of Jones vectors

When we have partial polarimetric data, a copolar channel (the polarization of the emitted wave is the same as the polarization considered for signal reception) and a crosspolar channel (reception is considered in the polarization orthogonal to that of the emitted wave), then we have Jones vectors.

We can decide to encode the polarimetric state using a color in the HSV color space:

  • The SPAN encodes the V value of intensity.
  • The orientation of the polarization of the received wave encodes the hue value H
  • The ellipticity of the polarization of the received wave encodes the saturation value S.

Each of these parameters must be encoded between 0 and 1. Therefore, I propose:

  • to encode for V the relative span value compared to the maximum SPAN of a set of values (if considering, for example, several adjacent pixels)
  • to encode for H the Orientation parameter, normalized between 0 and 1. With the convention H=(OrientationAngle+π)/(2π), the hue values 0 and 1 correspond to the Vertical orientation, 0 corresponds to the Horizontal orientation:
The encoding of orientations by color
  • to encode for S the ellipticity parameter, such that the value 1 corresponds to zero ellipticity (linear polarization), the value 0 corresponds to maximum ellipticity, that of the circle (±π/4, sin⁡(2ϵ)=±1), thus S=1−|sin⁡(2ϵ)|

With these conventions, we propose the following few lines of Python to analyze the polarization states in a neighborhood of pixels in an image:

def TraceEllipseSpatial(Ex,Ey):
"""
Plot ellipses based on complex temporal profiles of electric field components in a spatial neighborhood.

Args:
Ex (numpy.ndarray): Spatial Matrix of the electric field component in the x-direction (complex).
Ey (numpy.ndarray): Spatial Matrix of the electric field component in the y-direction (complex).

Returns:
None
"""
# Generate angles for the ellipse trace
u = np.linspace(0, 2 * np.pi, 1000)

# compute MAX SPAN
SPAN=np.sqrt(np.max(np.abs(Ex)**2+np.abs(Ey)**2))

nx,ny=np.shape(Ex)

fig, axes = plt.subplots(nrows=nx, ncols=ny, figsize=(ny, nx), sharex=True, sharey=True)

if nx==1:
axes = np.array([axes]) # Ensures axes is a 2D array
if ny==1:
axes = np.array([axes]) # Ensures axes is a 2D array

for i in range(nx):
for j in range(ny):
a, b = Ex[i, j], Ey[i, j]
OrientationAngle, sin2Xhi, span=Jones2EllipseParameters(a,b)
OrientationAngle = (OrientationAngle + np.pi) / (2 * np.pi) # Normalize the orientation angle between 0 and 1

result = np.dstack((OrientationAngle,(1-np.abs(sin2Xhi)),span/SPAN))
color = hsv_to_rgb(result)[0][0]

delta=np.angle(a*np.conj(b))
# Parametric equations for the ellipse
X=np.abs(a)*np.cos(u)
Y=np.abs(b)*np.cos(u+delta)

axes[i, j].plot(X/SPAN, Y/SPAN, '.k', markersize=1)
axes[i, j].set_facecolor(color)

axes[i, j].set_xlim(-1, 1)
axes[i, j].set_ylim(-1, 1)
axes[i, j].set_adjustable('box')
axes[i, j].set_aspect('equal')
axes[i, j].grid(False)
axes[i, j].set_xticks([])
axes[i, j].set_yticks([])
plt.subplots_adjust(wspace=0, hspace=0.2)
plt.show()

With this code applied to a 8x4 pixel neighborhood of an image, we obtain the following representation:

This representation will be useful to us later to better understand the principle of erodicity: can we make statistical estimates on the polarimetric properties of an object from its spatial neighborhood? From its stationary temporal profile?

--

--

Elise Colin

Researcher with broad experience in Signal and Image processing, focusing on big data and IA aspects for Earth observation images, and medical images.