Skip to content
AI360Xpert
Beta

Polarization Imaging

Reflected light wiggles in preferred directions, and surfaces stamp their angle on it. Polarization cameras read that wiggle to cut glare, find transparent objects, and map surface normals.

Rotating the polarizer from 30 to 90 degrees drops glare from 75 to zero while the diffuse surface stays readable
Rotating the polarizer from 30 to 90 degrees drops glare from 75 to zero while the diffuse surface stays readable

Why Does This Exist?

Glass, water, and polished metal defeat RGB and depth alike: transparency shows the background, specular reflections show the light source, and structured light scatters. Windshields hide drivers, bottles vanish on conveyors, puddles masquerade as asphalt. Brightness and range report the wrong surface with full confidence.

Polarization reads what reflection geometry writes. Specular glare polarizes strongly along the surface; diffuse reflection barely polarizes at all. Capturing four polarization angles per pixel (Stokes parameters) separates the two, kills glare, exposes transparent objects, and recovers surface normals indoors and out. The angular sibling is light field imaging; the map is alternative sensing.

The one idea you need first. Malus's law dims polarized light through a polarizer by the squared cosine of the angle between them: I=I0cos⁡2θI = I_0\cos^2\theta. Crossed at 9090 degrees, nothing passes (cos⁡290∘=0\cos^2 90^\circ = 0); aligned, everything does. The degree of polarization (polarized fraction) distinguishes glare (high) from matte surface (low) per pixel.

Think of It Like This

Sunglasses with a dimmer switch

Polarized sunglasses kill road glare because reflected light wiggles mostly horizontally and the lenses pass only vertical wiggle. Rotate your head sideways and the glare returns — the filter's angle decides, continuously, how much dazzle survives.

A polarization camera wears four sunglasses at once (00, 4545, 9090, 135135 degrees) on neighboring pixels. Per-pixel arithmetic then turns the dimmer continuously: glare minimized here, surface kept there, normals computed everywhere. One exposure, every head-tilt simultaneously.

How It Actually Works

Division-of-focal-plane sensors tile 2×22 \times 2 polarizer grids over the pixels, capturing all four angles in one shot (at quarter spatial resolution each). From the four intensities come Stokes components: total intensity, two linear-polarization terms, and from them degree and angle of polarization. Shape-from-polarization inverts Fresnel equations to surface normals up to known ambiguities (resolved with coarse depth or multiview). Glare removal subtracts the polarized component, keeping the diffuse remainder.

Calibration matters: pixelated polarizers leak (finite extinction ratios) and misalign, so radiometric and geometric calibration precede any quantitative claim.

Worked example

Glare of strength I0=100I_0 = 100 (arbitrary units) meets a polarizer at angle θ\theta to the glare axis:

  1. θ=30∘\theta = 30^\circ: I=100cos⁡230∘=100×0.75=75I = 100\cos^2 30^\circ = 100 \times 0.75 = 75.
  2. θ=60∘\theta = 60^\circ: I=100×0.25=25I = 100 \times 0.25 = 25.
  3. θ=90∘\theta = 90^\circ: I=100×0=0I = 100 \times 0 = 0.

The glare knob turns 75→25→075 \to 25 \to 0 while unpolarized diffuse surface light passes at half strength throughout (cos⁡2\cos^2 averages to 0.50.5 over angles). Per-pixel min-max across the four captures automates the knob: keep the diffuse floor, discard the polarized ceiling.

Code

The point of this snippet is the knob: Malus arithmetic reproduces the 75→25→075 \to 25 \to 0 glare ramp.

import math

def malus(i0: float, theta_deg: float) -> float:    return i0 * math.cos(math.radians(theta_deg)) ** 2  # polarized part

print(round(malus(100.0, 30.0), 1))  # -> 75.0print(round(malus(100.0, 60.0), 1))  # -> 25.0print(round(malus(100.0, 90.0), 1))  # -> 0.0

Watch Out For

Matte surfaces that barely polarize

Diffuse reflection randomizes oscillation direction, so chalk, cloth, and rough concrete carry near-zero polarization signal. Normals-from-polarization on matte objects amplify noise into spiky garbage while reporting full confidence.

Gate by degree of polarization: trust normals where it runs high (specular, smooth dielectrics), fall back to multiview or photometric stereo where it does not. The sensor reports its own reliability — read it.

Leaky pixels and lazy calibration

Real pixelated polarizers extinguish imperfectly (real ratios, not infinity) and sit slightly rotated; skipping calibration biases every Stokes estimate. Glare "removal" then leaves residue exactly where the demo promised zero.

Calibrate extinction and orientation per sensor with known polarized sources, and re-check after thermal drift. Quantitative polarization without calibration numbers is qualitative photography with extra steps.

The Quick Version

  • Polarization cameras capture four oscillation angles per pixel, separating glare from surface.
  • Malus's law I=I0cos⁡2θI = I_0\cos^2\theta is the knob: the worked fixture ramps glare 75→25→075 \to 25 \to 0.
  • Transparent and specular objects surface where RGB and depth report backgrounds.
  • Shape-from-polarization needs glossy dielectrics; matte surfaces carry no signal to invert.
  • Calibrate extinction and orientation per sensor or "removal" leaves residue.