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 most R code chunks are “folded” so as to decrease the clutter. Above each plot you will find a small triangle followed by “Code”. Above this text box is the code used to attach the packages used and setting plot defauls, later chunks depend on earlier ones. Clicking on the triangle “unfolds” the code chunk making visible the R code used to produce the plot.
The code 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.
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] "Heliopan_UVIR_CUT_Digital_2.2mm_52mm"
[5] "Kolari_UVIR_Cut_specs"
[6] "Rocolax_UVIR_Cut_445nm_650nm_1.1mm_52mm"
[7] "Rocolax_UVIR_Cut_PRO_HD_(W)_1.1mm_30.5mm"
[8] "Rocolax_UVIR_Cut_PRO_HD_(W)_1.1mm_52mm"