As shown in the previous post, the cheap 8x close-up filter introduces a lot of chromatic aberration (CA), especially at high magnification (45-150mm lens at maximum focal length). This is obvious when taking a picture of a black and white checkered pattern.
Checkered pattern (1mm square size), uncorrected. |
Here, I'm pushing this to the limit: adding a very cheap close-up adapter, that introduces a lot of CA, and seeing how we can recover a decent-looking image.
What you will need here:
- hugin/panotools
- Ruby
- exiftool
- All these commands are easier to run on Linux. There are ways of doing similar stuff on Windows (cygwin?) and MacOS X, but I won't go into that.
Test pattern
I couldn't find a simple test pattern (read: a 2-minute Google search didn't output anything good), so I decided to create one, with checker pattern of 1mm, 0.5mm, 0.2mm, and various grid patterns.I use some Ruby code to generate a SVG file, that can then easily be converted to pdf. The source code to generate the pattern is available on github, and you can download the calibration pattern pdf.
Calibration pattern. Download the PDF here. My printer cannot render properly the 0.2mm checker pattern, nor the 0.1mm line width. For the rest, the quality seems quite good. |
Parameter detection
To detect the chromatic aberration parameters, we are going to use tca_convert, which is part of the hugin/panotools package. Running this command on the picture shown above:
$ tca_correct -o abcv image.jpg
outputs something like:
-r -0.0025220:0.0097571:-0.0102529:0.9939710 -b -0.0086956:0.0221789:-0.0163386:1.0116266
That gives you radial distortion coefficient for the red and blue channels, which you can pass as parameters to fulla:
$ fulla -r -0.0025220:0.0097571:-0.0102529:0.9939710 -b -0.0086956:0.0221789:-0.0163386:1.0116266 image.jpg
which creates a new file, image_corr.jpg:Checkered pattern, corrected. |
Averaging
Instead of relying a a single picture to compute parameters, I use a series of 12 different pictures of my test pattern. I compute the parameters for all the images in a batch:
$ ls *.JPG | xargs -I{} tca_correct -o abcv {} | tee params.log
As you can see in the following box plot, there is some variability in the parameters, and some clear outliers. For each of the parameters, I chose to use the median of the 12 estimates (the median is less sensitive to outliers than the mean).
Box plot of the parameters a, b, c and v, for the red and blue channels. The box indicates 25% and 75% percentile, while the horizontal bar is the 50% percentile (i.e. the median). |
I then use a Ruby script to compute the median:
$ ruby parse.rb
In my case, the final parameters are:
$ fulla -r -0.0046300:0.0177484:-0.0198170:0.9971389 -b 0.0007956:-0.0029477:0.0041624:1.0069115 image.jpg
You can download the code on github (as well as the R script to show the boxplot).
Batch correction of pictures
Finally, you can correct pictures in a batch, using a command such as:
$ ls *.JPG | xargs -I{} fulla -r -0.0046300:0.0177484:-0.0198170:0.9971389 -b 0.0007956:-0.0029477:0.0041624:1.0069115 {}
Unfortunately, fulla does not keep EXIF information, but you can recover it with this one-liner, making use of exiftool:
$ ls *_corr.JPG | ruby -ne 'm = $_.match(/(.*)_corr(.*)/); system "exiftool -all= -tagsfromfile #{m[1]}#{m[2]} -exif:all #{m[0]}"'
Sample pictures
Baby gecko (that I accidentally frightened, which made it stay put long enough for me to take a few pictures; it then ran away) |
No comments:
Post a Comment