• site home
  • blog home
  • galleries
  • contact
  • underwater
  • the bleeding edge

the last word

Photography meets digital computer technology. Photography wins -- most of the time.

You are here: Home / Color Science / Microcolor and CFA spectra

Microcolor and CFA spectra

March 9, 2022 JimK 6 Comments

I found an error (a prime symbol, ‘, omitted) in the code that I used to generate the images in the original post, so I have extensively revised it. My apologies.

In the previous post, I reported on the effect of the selectivity of the color filter array (CFA) spectra on color accuracy in cameras with a Bayer array or something similar. Today I’m going to talk about if and how the CFA selectivity affects another property, with I’m calling microcolor.

There is a small group of people that define microcontrast differently from most of us. The standard definition is contrast at some high spatial frequency — I favor 0.25 cycles per pixel. The people with a different definition say its the differentiation between colors that are very close together. I’m calling that microcolor to avoid confusion here.

This post has been some time in the creating, and I fear that I have invested more time and effort into the research behind it than it’s worth, but it was one of those things where I didn’t realize how hard it was going to be until I had so much time invested into it that I didn’t want to abandon the project.

The idea behind the work that you’re going to see below is to construct pairs of spectra that color-normal humans (I’ll be dropping the “color-normal” part for the rest of the post, but consider it implied) or the 1931 CIE 2-degree Standard Observer would say are close together, present those spectra to simulated cameras with different CFA response spectra, and measure the distance between color pairs as seen by the camera. This test does not measure color accuracy; we already looked at that (and noise) for the Macbeth CC24 patches, and may in the future look at that for small (and, what the hey, large) deviations from them. But in this post, I’m concerned with how different are pairs of colors as seen by the camera as compared to how different are pairs of colors as seen by a human. A camera with low microcolor would see smaller color differences than a human. A camera with high microcolor would see larger color differences than a human.

Here’s my methodology:

  • Write a camera simulator that takes as input the Macbeth CC24 spectra, a set of CFA/sensor response spectra, and a standard light source (I used D50).
  • Program the simulator to create optimal compromise matrices for going from raw values to CIE XYZ.
  • Create pairs of spectra that resolve to colors a fixed distance apart. For this post, I’m using CIELab DeltaE 2000 as the distance metric.
  • Measure the distances, in CIELab DeltaE 2000, between these pairs after the camera’s raw files are converted to CIE colors using the optimal compromise matrices.
  • Compare the two distances.

I thought hard about how to create the pairs of spectra. I finally decided to use the spectra of the Macbeth CC24 as basis functions. I took all 18 chromatic patches on the Macbeth CC24 chart (excluding the neutral bottom row of 6 patches), and mixed each one with the other 23 patches to create pairs with predetermined CIELab DeltaE 2000 distances. Thus there were 18 sets of pairs, one with each of the patches as the base, and 23 pairs in each set.

Here are the results for a set of CFA response spectra that match the CIE 1931 XYZ spectra:

 

The original pairs were all 2 DeltaE 2000 apart. What’s plotted for each chromatic patch is the average difference between the 23 pairs with that patch as the base, less the 2 DeltaE 2000 distance of the original pairs.  If the camera were perfect, All the bars would be zero. I’ve colored each of the bars with the color of the base patch in each set. The first thing to notice is how small the errors are. The vertical axis of the graph goes from -0.0016 to 0.0004 Delta E 2000. All the errors are very small. This is in spite of the fact that the compromise matrix created by the optimization program wasn’t quite the right one.

Next up is the optimal Gaussian CFA set from the preceding post.

The results are not as good as the CIE XYZ CFA set. Both the XYZ set and the Gaussian set above have about the same SMI; 99.3 for the Gaussian and 99.7 for the XYZ.

The people I was talking about at the top of this post say that narrower CFA spectra produce higher microcontrast microcolor. Let’s make the spectra narrower, with standard deviations of 20 nanometers. The peak frequencies are optimal for those standard deviations.

The errors are quite a bit greater, but still low at worst less than a twentieth of the actual shifts in DeltaE 2000.

 

Now I’ll make the standard deviation (sigma) even narrower, with optimal peak wavelengths:

The average microcolor metric  is now slightly negative. The errors are in general larger.

Does making the sigma really wide (with optima peak wavelengths) make the microcolor metric go negative?

On average, it does not do so significantly, although there are some very large swings, but they tend to cancel each other out.

Let’s look at a camera that did quite well in the past simulations, the Arriflex D21:

The average color error is very slightly greater than zero.

How about a couple of old CCD cameras?

The Hasselblad has a quite a bit of microcolor variation, and on average, shows a bit tiny bit less difference than the simulated eye sees.

So does the Leica M8, although most of the difference comes from a small number of patches.

Some more cameras:

My conclusions are:

  • Microcolor is a real thing: for some base colors, cameras/raw developers can show larger or smaller changes in captured color differences than observed by  the eye.
  • The effect is small, even with the color patches most affected
  • Average microcolor changes across all colors are tiny.
  • I see no evidence that narrower CFA spectra means more microcolor.
  • There is wide variation in microcolor as the base patch values change.
  • The two CFA spectra that produce the most accurate color produce the microcolor that most agrees with what the eye sees
  • The optimum Gaussian spectra produce slightly more microcolor errors than an ideal spectra set.

 

 

 

 

 

 

 

 

 

Color Science, The Last Word

← Optimal CFA spectral response Microcolor and CFA spectra, visually →

Comments

  1. Erik Kaffehr says

    March 10, 2022 at 8:59 am

    Thanks for the nice work!

    I don’t really understand how you constructed the Delta E = 2 patches.

    Anyway, my understanding is that zero on the vertical axis represent a Delta E = 2 difference, so negative values indicated underestimating color change and positive values indicate overestimating color change?

    Reply
    • JimK says

      March 10, 2022 at 9:22 am

      …my understanding is that zero on the vertical axis represent a Delta E = 2 difference, so negative values indicated underestimating color change and positive values indicate overestimating color change?

      That is correct.

      Reply
    • JimK says

      March 10, 2022 at 9:25 am

      I don’t really understand how you constructed the Delta E = 2 patches.

      For each pair of patches, I mixed the two spectra until I found a ratio that gave the desired deltaE.

      function newSpectrum = mixSpectra(self,xRefIndex,yRefIndex,xMixIndex,yMixIndex,ratio)
      [~,nwl] = size(self.wl);
      refSpectrum = zeros(1,nwl);
      refLum = reshape(self.refRoo,[4 6 nwl]);
      refSpectrum(1,:) = refLum(xRefIndex,yRefIndex,:);
      mixSpectrum = zeros(1,nwl);
      mixSpectrum(1,:) = self.refRoo(xMixIndex,yMixIndex,:);
      refContribution = refSpectrum .* (1.0 – ratio);
      mixContribution = mixSpectrum .* (ratio);
      newSpectrum = refContribution + mixContribution;
      end

      function ratio = findDifference(self,dE,xRefIndex,yRefIndex,xMixIndex,yMixIndex)
      fun = @(r) diff(r);
      ratio = fminbnd(fun,0.0,1.0);
      function deltaE = diff(r)
      newSpectrum = self.mixSpectra(xRefIndex,yRefIndex,xMixIndex,yMixIndex,r);
      delta = self.computeDifference(newSpectrum,xRefIndex,yRefIndex);
      deltaE = abs(delta – dE);
      end
      end

      Reply
      • Erik Kaffehr says

        March 15, 2022 at 12:07 am

        Thanks for that complete explanation!

        Best regards
        Erik

        Reply
  2. Jack Hogan says

    March 15, 2022 at 7:28 am

    Very interesting, thanks Jim.

    Reply
  3. Tucker Downs says

    April 1, 2022 at 12:11 pm

    A nice continuation of this series. I’ve never encountered the term micro-color but in general this is a case of observer-metamerism. Colors that should look one way to one observer(for example they should look like they have 2 units of dE difference) look different for another observer. This effect is present and measurable in humans (See Yuta Asano’s work in 2019) but we can also recognize that the cause (different sensitivities) is also present and powerful in artificial sensors as well.

    Here rather than comparing two spectra that should look exactly the same to a human (that is to say that the two spectra are metameric) you are comparing two spectra that should look close to the same to a human (the spectra are paramers). The paramer approach is probably easier to understand and more meaningful, so I appreciate seeing that here. BTW there is very little literature on this topic, CR&A would be a great journal to submit this kind of work to.

    Reply

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

May 2025
S M T W T F S
 123
45678910
11121314151617
18192021222324
25262728293031
« Apr    

Articles

  • About
    • Patents and papers about color
    • Who am I?
  • How to…
    • Backing up photographic images
    • How to change email providers
    • How to shoot slanted edge images for me
  • Lens screening testing
    • Equipment and Software
    • Examples
      • Bad and OK 200-600 at 600
      • Excellent 180-400 zoom
      • Fair 14-30mm zoom
      • Good 100-200 mm MF zoom
      • Good 100-400 zoom
      • Good 100mm lens on P1 P45+
      • Good 120mm MF lens
      • Good 18mm FF lens
      • Good 24-105 mm FF lens
      • Good 24-70 FF zoom
      • Good 35 mm FF lens
      • Good 35-70 MF lens
      • Good 60 mm lens on IQ3-100
      • Good 63 mm MF lens
      • Good 65 mm FF lens
      • Good 85 mm FF lens
      • Good and bad 25mm FF lenses
      • Good zoom at 24 mm
      • Marginal 18mm lens
      • Marginal 35mm FF lens
      • Mildly problematic 55 mm FF lens
      • OK 16-35mm zoom
      • OK 60mm lens on P1 P45+
      • OK Sony 600mm f/4
      • Pretty good 16-35 FF zoom
      • Pretty good 90mm FF lens
      • Problematic 400 mm FF lens
      • Tilted 20 mm f/1.8 FF lens
      • Tilted 30 mm MF lens
      • Tilted 50 mm FF lens
      • Two 15mm FF lenses
    • Found a problem – now what?
    • Goals for this test
    • Minimum target distances
      • MFT
      • APS-C
      • Full frame
      • Small medium format
    • Printable Siemens Star targets
    • Target size on sensor
      • MFT
      • APS-C
      • Full frame
      • Small medium format
    • Test instructions — postproduction
    • Test instructions — reading the images
    • Test instructions – capture
    • Theory of the test
    • What’s wrong with conventional lens screening?
  • Previsualization heresy
  • Privacy Policy
  • Recommended photographic web sites
  • Using in-camera histograms for ETTR
    • Acknowledgments
    • Why ETTR?
    • Normal in-camera histograms
    • Image processing for in-camera histograms
    • Making the in-camera histogram closely represent the raw histogram
    • Shortcuts to UniWB
    • Preparing for monitor-based UniWB
    • A one-step UniWB procedure
    • The math behind the one-step method
    • Iteration using Newton’s Method

Category List

Recent Comments

  • bob lozano on The 16-Bit Fallacy: Why More Isn’t Always Better in Medium Format Cameras
  • JimK on Goldilocks and the three flashes
  • DC Wedding Photographer on Goldilocks and the three flashes
  • Wedding Photographer in DC on The 16-Bit Fallacy: Why More Isn’t Always Better in Medium Format Cameras
  • JimK on Fujifilm GFX 100S II precision
  • Renjie Zhu on Fujifilm GFX 100S II precision
  • JimK on Fuji 20-35/4 landscape field curvature at 23mm vs 23/4 GF
  • Ivo de Man on Fuji 20-35/4 landscape field curvature at 23mm vs 23/4 GF
  • JimK on Fuji 20-35/4 landscape field curvature at 23mm vs 23/4 GF
  • JimK on Fuji 20-35/4 landscape field curvature at 23mm vs 23/4 GF

Archives

Copyright © 2025 · Daily Dish Pro On Genesis Framework · WordPress · Log in

Unless otherwise noted, all images copyright Jim Kasson.