Code
library(photobiology)
library(photobiologyFilters)
library(ggspectra)
theme_set(theme_bw())
Most ND filters are not neutral
Pedro J. Aphalo
2019-05-11
2023-05-17
neutral density filters, spectra
I have updated this page when transferring it to Quarto. I changed the plots to be built in R within the R markdown source file. As a result the page now also includes the listing of the R code used to create all plots.
A neutral density (ND) filter is a “grey” filter, a filter that transmits equal fractions of the incident radiation at all wavelengths. A perfectly neutral filter over a broad range of wavelengths is an idealized concept, and one very difficult to implement in practice. There are different approaches to making filters approximating colour neutrality. We here compare the spectral transmittance of of ND filters of three different types available for use on camera lenses and explain why the use of some of them can introduce strong colour casts in the photographs we take with them.
In this page code chunks can be “folded” so as to decrease the clutter. Above each plot, table or other R-code output you may find one or more “folded” code chunks signalled by a small triangle followed by “Code”. Clicking on the triangle “unfolds” folded chunks making the R code that produced the printed values, plots or tables visible. Clicking on the same icon on an “unfolded” chunk, folds it hiding the code.
The code when visible in the chunks can be copied by clicking on the top right corner, where an icon appears when the mouse cursor hovers over the code listing.
The </> Code
drop down menu to the right of the page title makes it possible to unfold and fold all code chunks in the page and to view the Quarto source of the whole web page.
Last year an interesting post was published at the Formatt-Hitech website describing the evolution of the neutral density (ND) filters used in photography. The post focuses mostly on the ND filters the company has offered over the years. Below I add some additional material comparing a few other filters. As is done in the post linked to above, I will not focus on small differences among filters produced with similar technologies as I suspect that some of the differences between them from different high-end manufacturers cannot be assessed by comparing single copies of filters. One would need to compare samples from multiple batches of each filter type and manufacturer, making this an expensive and rather unrewarding exercise. On the other hand, as described in the blog post at the Formatt-Hitech website, differences among technologies are huge and worthwhile paying attention to. Additionally, as for any filter used for imaging, the imaging properties depend on the parallelism of the two surfaces and on the lack of surface and internal defects in the glass. Here I will focus only on colour cast issues, as I do not have an objective way of testing for presence of these other defects.
Neutral density filters that are neutral over a broad range of wavelengths are not new, but because of their high cost were mainly used for scientific research or other special uses. In recent years high end ND filters based on these more expensive technologies have become rather common for use in photography and cinematography. They are more expensive than “usual” ND filters but also much closer to being colour neutral. The asking price varies with brand, even within a given technology. Over the years I have used mostly “resin” ND filters from Cokin and Formatt-Hitech for imaging, and ND “gels” from Rosco for other uses. Below I give some example spectra.
The strength of filters can be measured as optical density (OD) which is also called absorbance, or as transmittance. Commercially, it is frequent to describe filters by the denominator of the fractional transmittance (T). A filter labelled ND16 transmits 1/16 or the incident radiation, and is equivalent to halving the flux 4 times, which in photography we call 4 EVs or 4 f-stops, as illustrated in the table.
OD | 0.3 | 0.6 | 0.9 | 1.2 | 1.8 |
---|---|---|---|---|---|
NDnn | ND2 | ND4 | ND8 | ND16 | ND64 |
T | 1/2 =0.5 | 1/4 = 0.25 | 1/8 = 0.125 | 1/16 = 0.062 | 1/64 = 0.0156 |
f-stops | 1 | 2 | 3 | 4 | 6 |
Current cheaper ND filters and/or older ones at all price points are made using absorptive glass or plastic resin, which is almost impossible to produce with equal transmittance across a broad range of wavelengths. Some of the currently available high-end filters are in contrast made by deposition of a very thin metal film on the surface of clear glass and can provide a nearly uniform light attenuating effect across different wavelengths.
This comparison is not about brands, but about technologies. We will compare one Firecrest ND filter from Formatt-Hitech (OD 1.2) made from optical glass with metal coating, one Schott absorptive glass filter, one absorptive glass filter from Zomei, and one absorptive plastic resin filter also from Zomei. In 52 mm size the Firecrest filter costs 77 €. Zomei also sells Pro II MC ND filters made from light absorbing optical glass at 18 to 19 € for ND8 and N64 densities. Equivalent ND filters from Heliopan sell at 50 to 55 €. I have included Schott ND glass in the comparison as it can give a good idea of what is the spectrum for a high quality filter using absorptive optical glass. The Zomei Pro Optical (resin) filter costs 4 to 8 €.
plot_filters.mspct <- c(filters.mspct[grep("Zomei|Firecrest", neutral_filters, value = TRUE)[-c(1, 3, 4)]],
convertTfrType(
filters.mspct[grep("NG3", neutral_filters, value = TRUE)],
Tfr.type = "total"
))
names(plot_filters.mspct) <- gsub("_", " ", names(plot_filters.mspct))
plot_labels.tb <- data.frame(spct.idx = names(plot_filters.mspct),
T.nominal = c(1/16, 1/8, 1/8, 1/8),
labels = sprintf("OD %s = T %.3f",
c("09", rep("12", 3)),
c(1/16, 1/8, 1/8, 1/8)))
autoplot(plot_filters.mspct,
range = c(200, 1050),
w.band = split_bands((2:10) * 100),
facets = 1L,
annotations = list(c("+", "boundaries"), c("-", "labels"))) +
geom_hline(data = plot_labels.tb,
mapping = aes(yintercept = T.nominal),
linetype = "dashed",
colour = "blue") +
geom_text(data = plot_labels.tb,
mapping = aes(y = T.nominal,
label = labels),
x = 200,
hjust = "left",
vjust = "bottom",
size = 2,
colour = "blue",
nudge_y = 0.02)
A filter that is really neutral would have a perfectly flat transmittance spectrum, represented in the plots by the blue dashed line computed based on the nominal “strength” of each filter. The Firecrest filters approximate neutrality very well in the visible and near-infrared regions of the spectrum, ensuring minimal colour casts. The traditional filters exemplified by the Schott NG3 glass have a fairly flat spectrum between 450 and 650 nm. As filtered digital camera sensors, depending on the model and brand, can respond in the range 370 to 680 nm, a moderate colour cast can be expected, and a colour cast than can be well controlled by stacking an UV-IR cut filter (visible band-pass filter). In contras the cheap resin filter has a spectrum that is far from being flat, even within the visible region and may result in colour cast even after stacking it with an UV-IR cut filter. As a good UVIR cut filter can cost as much or more than the Firecrest ND filters, or equivalent metal deposition ND filters of other brands, in practice it makes little sense to buy a cheaper ND filter and an UVIR cut filter to stack them. The total transmittance spectrum of an UV-IR cut filter is shown below.
As a recommended way of removing colour casts introduced by ND filters is to stack them with UVIR cut filters, we simulate the effect of staking an UVIR cut filter with each of the ND filters. For the simulation I have used the Firecrest UV-IR cut filter with sharp cut-in and cut-off whose spectrum is plotted above.
conv_filters.mspct <- convolve_each(plot_filters.mspct, filters.mspct$Firecrest_UVIR_Cut_0.96mm_52mm)
autoplot(conv_filters.mspct,
range = c(200, 1050),
w.band = split_bands((2:10) * 100),
facets = 1L,
annotations = list(c("+", "boundaries"), c("-", "labels"))) +
geom_hline(data = plot_labels.tb,
mapping = aes(yintercept = T.nominal),
linetype = "dashed",
colour = "blue") +
geom_text(data = plot_labels.tb,
mapping = aes(y = T.nominal,
label = labels),
x = 200,
hjust = "left",
vjust = "bottom",
size = 2,
colour = "blue",
nudge_y = 0.02)
In addition to colour casts, very cheap filters may have densities quite far from the one indicated in the box and filter rim. I do not show plots, but out of three KnightX Resin ND filters I bought from AliExpress, one marked ND16 had OD of 1.7 to 2.1 instead of 1.2 (a difference of between 2 and 3 f-tops) while the other two (ND4 and ND8) were closer to the values marked. Being made of resin, the shape of the spectra are similar the the Zomei Resin filter. KnightX filters are a bit cheaper if bought without the storage case.
Additional information on the filters may be available at the manufacturer’s web sites: https://www.formatt-hitech.com/, https://www.schott.com/ and https://www.zomei.com/
I used the filters I had at hand. Other brands like Hoya, Heliopan, B+W, Nisi and Haida include ND filters in their catalogues. Some of them use absorptive glass and some use metal films. When buying filters it is worthwhile not only checking the price but also the technology used.
The plots have been created in R using packages ‘photobiology’ and ‘ggspectra’. The spectral data are included in R package ‘photobiologyFilters’ (CRAN version 0.5.0 or later). More information about the packages is available at https://www.r4photobiology.info/.
Package ‘photobiologyFilters’ contains spectral data for additional neutral density and UVIR cut filters. The neutral and UVIR-cut filters for use in photography for which data are included can be listed with the code shown below. The Schott NG3 shown above is not directly available as a camera filter, although Heliopan and some other filter manufacturers could be using Schott NG series glass in the filters they sell.
[1] "Firecrest_IRND15_MC_0.79mm_62mm" "Firecrest_ND12_1.1mm_52mm"
[3] "Firecrest_ND12_2.0mm_67x85mm" "Firecrest_ND18_1.2mm_52mm"
[5] "Hitech_ND_06_HL_1.75mm_85x110mm" "Hitech_ND_09_HL_1.75mm_85x110mm"
[7] "KnightX_ND16_resin_1.8mm_52mm" "KnightX_ND4_resin_1.7mm_72mm"
[9] "KnightX_ND8_resin_1.9mm_72mm" "Rosco_ND_Ecolour_no209_0.075mm_NA"
[11] "Rosco_ND_EColour_no210_0.075mm_NA" "Rosco_ND_EColour_no211_0.075mm_NA"
[13] "Zomei_ND09_Pro_II_MC_1.2mm_52mm" "Zomei_ND8_Resin_1.7mm_52mm"
[1] "Firecrest_UVIR_Cut_0.96mm_52mm"
[2] "Firecrest_UVIR_Cut_1.2mm_46mm"
[3] "Fotga_UVIR_CUT_0.54mm_52mm"
[4] "Fotga_UVIR_CUT_0.54mm_72mm"
[5] "Heliopan_UVIR_CUT_Digital_2.2mm_52mm"
[6] "Kolari_UVIR_Cut_specs"
[7] "Rocolax_UVIR_Cut_445nm_650nm_1.1mm_52mm"
[8] "Rocolax_UVIR_Cut_PRO_HD_(W)_1.1mm_30.5mm"
[9] "Rocolax_UVIR_Cut_PRO_HD_(W)_1.1mm_52mm"
---
title: "Neutral Density (ND) Filters"
subtitle: "Most ND filters are not neutral"
author: "Pedro J. Aphalo"
date: "2019-05-11"
date-modified: "2023-05-17"
toc: true
categories: [equipment, filters]
keywords: [neutral density filters, spectra]
format:
html:
code-fold: true
code-tools: true
image: images/_6140075.jpg
license: "CC BY-SA"
editor:
markdown:
wrap: 72
---
::: callout-note
I have updated this page when transferring it to Quarto. I changed the plots to be built in R within the R markdown source file. As a result the page now also includes the listing of the R code used to create all plots.
:::
{fig-alt="Photograph"}
A neutral density (ND) filter is a "grey" filter, a filter that
transmits equal fractions of the incident radiation at all wavelengths.
A perfectly neutral filter over a broad range of wavelengths is an
idealized concept, and one very difficult to implement in practice.
There are different approaches to making filters approximating colour
neutrality. We here compare the spectral transmittance of of ND filters
of three different types available for use on camera lenses and explain
why the use of some of them can introduce strong colour casts in the
photographs we take with them.
{{< include /_includes/folded-code-tip.qmd >}}
```{r, message=FALSE}
library(photobiology)
library(photobiologyFilters)
library(ggspectra)
theme_set(theme_bw())
```
## Introduction
Last year [an interesting
post](https://www.formatt-hitech.com/blog/2018/2/6/the-evolution-of-neutral-density-filters)
was published at the [Formatt-Hitech
website](https://www.formatt-hitech.com/) describing the evolution of
the neutral density (ND) filters used in photography. The post focuses
mostly on the ND filters the company has offered over the years. Below I
add some additional material comparing a few other filters. As is done
in the post linked to above, I will not focus on small differences among
filters produced with similar technologies as I suspect that some of the
differences between them from different high-end manufacturers cannot be
assessed by comparing single copies of filters. One would need to
compare samples from multiple batches of each filter type and
manufacturer, making this an expensive and rather unrewarding exercise.
On the other hand, as described in the blog post at the [Formatt-Hitech
website](https://www.formatt-hitech.com/), differences among
technologies are huge and worthwhile paying attention to. Additionally,
as for any filter used for imaging, the imaging properties depend on the
parallelism of the two surfaces and on the lack of surface and internal
defects in the glass. Here I will focus only on colour cast issues, as I
do not have an objective way of testing for presence of these other
defects.
Neutral density filters that are neutral over a broad range of
wavelengths are not new, but because of their high cost were mainly used
for scientific research or other special uses. In recent years high end
ND filters based on these more expensive technologies have become rather
common for use in photography and cinematography. They are more
expensive than "usual" ND filters but also much closer to being colour
neutral. The asking price varies with brand, even within a given
technology. Over the years I have used mostly "resin" ND filters from
Cokin and Formatt-Hitech for imaging, and ND "gels" from Rosco for other
uses. Below I give some example spectra.
The strength of filters can be measured as optical density (OD) which is
also called absorbance, or as transmittance. Commercially, it is
frequent to describe filters by the denominator of the fractional
transmittance (T). A filter labelled ND16 transmits 1/16 or the incident
radiation, and is equivalent to halving the flux 4 times, which in
photography we call 4 EVs or 4 f-stops, as illustrated in the table.
| **OD** | 0.3 | 0.6 | 0.9 | 1.2 | 1.8 |
|-------------|----------|------------|-------------|--------------|---------------|
| **NDnn** | ND2 | ND4 | ND8 | ND16 | ND64 |
| **T** | 1/2 =0.5 | 1/4 = 0.25 | 1/8 = 0.125 | 1/16 = 0.062 | 1/64 = 0.0156 |
| **f-stops** | 1 | 2 | 3 | 4 | 6 |
## Camera lens filters
Current cheaper ND filters and/or older ones at all price points are
made using absorptive glass or plastic resin, which is almost impossible
to produce with equal transmittance across a broad range of wavelengths.
Some of the currently available high-end filters are in contrast made by
deposition of a very thin metal film on the surface of clear glass and
can provide a nearly uniform light attenuating effect across different
wavelengths.
This comparison is not about brands, but about technologies. We will
compare one Firecrest ND filter from Formatt-Hitech (OD 1.2) made from
optical glass with metal coating, one Schott absorptive glass filter,
one absorptive glass filter from Zomei, and one absorptive plastic resin
filter also from Zomei. In 52 mm size the Firecrest filter costs 77 €.
Zomei also sells Pro II MC ND filters made from light absorbing optical
glass at 18 to 19 € for ND8 and N64 densities. Equivalent ND filters
from Heliopan sell at 50 to 55 €. I have included Schott ND glass in the
comparison as it can give a good idea of what is the spectrum for a high
quality filter using absorptive optical glass. The Zomei Pro Optical
(resin) filter costs 4 to 8 €.
```{r}
#| label: fig-ND
#| fig-asp: 2
#| fig-cap: Transmittance spectra of four neutral density (ND) filters made using difference technologies.
plot_filters.mspct <- c(filters.mspct[grep("Zomei|Firecrest", neutral_filters, value = TRUE)[-c(1, 3, 4)]],
convertTfrType(
filters.mspct[grep("NG3", neutral_filters, value = TRUE)],
Tfr.type = "total"
))
names(plot_filters.mspct) <- gsub("_", " ", names(plot_filters.mspct))
plot_labels.tb <- data.frame(spct.idx = names(plot_filters.mspct),
T.nominal = c(1/16, 1/8, 1/8, 1/8),
labels = sprintf("OD %s = T %.3f",
c("09", rep("12", 3)),
c(1/16, 1/8, 1/8, 1/8)))
autoplot(plot_filters.mspct,
range = c(200, 1050),
w.band = split_bands((2:10) * 100),
facets = 1L,
annotations = list(c("+", "boundaries"), c("-", "labels"))) +
geom_hline(data = plot_labels.tb,
mapping = aes(yintercept = T.nominal),
linetype = "dashed",
colour = "blue") +
geom_text(data = plot_labels.tb,
mapping = aes(y = T.nominal,
label = labels),
x = 200,
hjust = "left",
vjust = "bottom",
size = 2,
colour = "blue",
nudge_y = 0.02)
```
A filter that is really neutral would have a perfectly flat
transmittance spectrum, represented in the plots by the blue dashed line
computed based on the nominal "strength" of each filter. The Firecrest
filters approximate neutrality very well in the visible and
near-infrared regions of the spectrum, ensuring minimal colour casts.
The traditional filters exemplified by the Schott NG3 glass have a
fairly flat spectrum between 450 and 650 nm. As filtered digital camera
sensors, depending on the model and brand, can respond in the range 370
to 680 nm, a moderate colour cast can be expected, and a colour cast
than can be well controlled by stacking an UV-IR cut filter (visible
band-pass filter). In contras the cheap resin filter has a spectrum that
is far from being flat, even within the visible region and may result in
colour cast even after stacking it with an UV-IR cut filter. As a good
UVIR cut filter can cost as much or more than the Firecrest ND filters,
or equivalent metal deposition ND filters of other brands, in practice
it makes little sense to buy a cheaper ND filter and an UVIR cut filter
to stack them. The total transmittance spectrum of an UV-IR cut filter
is shown below.
```{r}
#| label: fig-UVIR-cut
#| fig-asp: 0.55
#| fig-cap: Light transmission of an UV-IR cut filter or visible-bandpass filter. This is not an absorptive filter but instead an interference filter.
autoplot(filters.mspct$Firecrest_UVIR_Cut_0.96mm_52mm,
range = c(200, 1050),
w.band = split_bands((2:10) * 100),
facets = 1L,
annotations = list(c("+", "boundaries"), c("-", "labels")))
```
As a recommended way of removing colour casts introduced by ND filters
is to stack them with UVIR cut filters, we simulate the effect of
staking an UVIR cut filter with each of the ND filters. For the
simulation I have used the Firecrest UV-IR cut filter with sharp cut-in
and cut-off whose spectrum is plotted above.
```{r}
#| label: fig-ND-UVIR-cut
#| fig-asp: 2
#| fig-cap: Transmittance spectra of the four neutral density (ND) filters from @fig-ND after convolution with the UVIR cut filter in @fig-UVIR-cut.
conv_filters.mspct <- convolve_each(plot_filters.mspct, filters.mspct$Firecrest_UVIR_Cut_0.96mm_52mm)
autoplot(conv_filters.mspct,
range = c(200, 1050),
w.band = split_bands((2:10) * 100),
facets = 1L,
annotations = list(c("+", "boundaries"), c("-", "labels"))) +
geom_hline(data = plot_labels.tb,
mapping = aes(yintercept = T.nominal),
linetype = "dashed",
colour = "blue") +
geom_text(data = plot_labels.tb,
mapping = aes(y = T.nominal,
label = labels),
x = 200,
hjust = "left",
vjust = "bottom",
size = 2,
colour = "blue",
nudge_y = 0.02)
```
In addition to colour casts, very cheap filters may have densities quite
far from the one indicated in the box and filter rim. I do not show
plots, but out of three KnightX Resin ND filters I bought from
AliExpress, one marked ND16 had OD of 1.7 to 2.1 instead of 1.2 (a
difference of between 2 and 3 f-tops) while the other two (ND4 and ND8)
were closer to the values marked. Being made of resin, the shape of the
spectra are similar the the Zomei Resin filter. KnightX filters are a
bit cheaper if bought without the storage case.
Additional information on the filters may be available at the
manufacturer's web sites: <https://www.formatt-hitech.com/>,
<https://www.schott.com/> and <https://www.zomei.com/>
I used the filters I had at hand. Other brands like Hoya, Heliopan, B+W,
Nisi and Haida include ND filters in their catalogues. Some of them use
absorptive glass and some use metal films. When buying filters it is
worthwhile not only checking the price but also the technology used.
::: callout-tip
The plots have been created in R using packages 'photobiology' and
'ggspectra'. The spectral data are included in R package
'photobiologyFilters' (CRAN version 0.5.0 or later). More information
about the packages is available at <https://www.r4photobiology.info/>.
Package 'photobiologyFilters' contains spectral data for additional
neutral density and UVIR cut filters. The neutral and UVIR-cut filters
for use in photography for which data are included can be listed with
the code shown below. The Schott NG3 shown above is not directly
available as a camera filter, although Heliopan and some other filter
manufacturers could be using Schott NG series glass in the filters they
sell.
```{r}
#| code-fold: false
library(photobiologyFilters)
intersect(neutral_filters, photography_filters)
intersect(uvir_cut_filters, photography_filters)
```
:::