|
|
Line 1: |
Line 1: |
| =Hint:=
| | Moved to Manual - https://wiki.apertus.org/index.php/AXIOM_Beta/Manual#Factory_Calibration |
| Create a variable containing your Betas IP for easy access.
| |
|
| |
|
| export BETA=192.168.1.101
| | Here in the Labs - https://lab.apertus.org/T829 |
| | |
| =Preparations=
| |
| Install on your AXIOM Beta:
| |
| pacman -S python-numpy
| |
| | |
| Install the following packages on your PC:
| |
| dcraw octave
| |
| | |
| For Ubuntu this would look like:
| |
| sudo apt-get install dcraw octave
| |
| | |
| Download and compile raw2dng on your PC: https://github.com/apertus-open-source-cinema/misc-tools-utilities/tree/master/raw2dng
| |
| | |
| ==Step 1: Check range of the input signal==
| |
| | |
| On the Beta set gain to x1 by running:
| |
| ./set_gain.sh 1
| |
| | |
| Download this Octave file to your PC into your current work directory:
| |
| wget https://raw.githubusercontent.com/apertus-open-source-cinema/misc-tools-utilities/master/darkframes/read_raw.m
| |
| | |
| Capture an overexposed image with the Beta and check the levels:
| |
| | |
| ssh root@$BETA "./cmv_snap3 -2 -b -r -e 100ms" > snap.raw12
| |
| ./raw2dng snap.raw12 --totally-raw
| |
| octave
| |
| octave:1> a = read_raw('snap.DNG')
| |
| octave:2> prctile(a(:), [0.1 1 50 99 99.9])
| |
| | |
| If everything worked you will get a wall of numbers now. TODO: We should extract the essential pieces of information here... (min/max maybe)?
| |
| | |
| Lower numbers should be around 50...300 (certainly not zero).
| |
| Higher numbers should be around 4000, but not 4095.
| |
| | |
| Repeat for gains 2, 3, 4.
| |
| | |
| Put this in startup script (ie: [[kick_manual.sh]]) :
| |
| ./set_gain.sh 1
| |
| | |
| ==Step 2: RCN calibration==
| |
| | |
| RCN stands for Row Coloumn Noise correction meaning we filter out the fixed pattern noise.
| |
| | |
| Make sure you have these scripts already in your Betas /root/ directly: https://github.com/apertus-open-source-cinema/beta-software/tree/master/software/scripts
| |
| | |
| Clear the old RCN values:
| |
| ssh root@$BETA "./rcn_clear.py"
| |
| | |
| Now you need to make sure that your Beta is not capturing any light (really not a single photon should hit the sensor :) ):
| |
| # close the lens aperture as far as possible
| |
| # attach lens cap
| |
| # put black lens bag over Beta
| |
| # turn off all lights in the room - do this at night or in a completely dark room
| |
| | |
| Take 64 dark frames at 10ms, gain x1 with the following script executed on your PC (1.2 GB needed):
| |
|
| |
| ssh root@$BETA " ./set_gain.sh 1"
| |
| ssh root@$BETA ". ./cmv.func; fil_reg 15 0" # disable HDMI stream
| |
| for i in `seq 1 64`; do
| |
| ssh root@$BETA "./cmv_snap3 -2 -b -r -e 10ms" > dark-x1-10ms-$i.raw12
| |
| done
| |
| ssh root@$BETA ". ./cmv.func; fil_reg 15 0x01000100" # enable HDMI stream
| |
| | |
| Compute a temporary dark frame for RCN calibration:
| |
| raw2dng --swap-lines --no-blackcol --calc-darkframe dark-x1-10ms-*.raw12
| |
| | |
| This should process quite quickly and output something like the following at the end:
| |
| | |
| <nowiki>Averaged 64 frames exposed from 12.00 to 12.00 ms.
| |
| Could not compute dark current.
| |
| Please use different exposures, e.g. from 1 to 50 ms.
| |
| Dark offset : 0.00
| |
| Writing darkframe-x1.pgm...
| |
| Done.</nowiki>
| |
| | |
| | |
| Rename and upload darkframe to your Beta:
| |
| mv darkframe-x1.pgm darkframe-rcn.pgm
| |
| scp darkframe-rcn.pgm root@$BETA:/root/
| |
| | |
| Set the RCN values:
| |
| ssh root@$BETA "./rcn_darkframe.py darkframe-rcn.pgm"
| |
| | |
| Put this in startup script (ie : [[kick_manual.sh]]) :
| |
| ./rcn_darkframe.py darkframe-rcn.pgm
| |
| | |
| If you get an error report like this:
| |
| <nowiki>Traceback (most recent call last):
| |
| File "rcn_darkframe.py", line 17, in <module>
| |
| import png
| |
| ImportError: No module named 'png'</nowiki>
| |
| | |
| Make sure the Beta is connected to the Internet via Ethernet and run:
| |
| pip install pypng
| |
| | |
| and then run the python script again
| |
| | |
| | |
| ===Validation===
| |
| | |
| ====Method 1:====
| |
| | |
| Put a lens cap on the camera and check the image on a HDMI monitor.
| |
| | |
| In the camera set the matrix gains to:
| |
| <nowiki>./mat4_conf.sh 20 0 0 0 0 10 10 0 0 10 10 0 0 0 0 10 0 0 0 0</nowiki>
| |
| | |
| run:
| |
| <nowiki>./rcn_clear.py</nowiki>
| |
| | |
| The static noise profile should be visible.
| |
| | |
| run:
| |
| ./rcn_darkframe.py darkframe-rcn.pgm
| |
| | |
| The static noise profile should be gone.
| |
| You will still see dynamic row noise (horizontal lines flickering) - thats expected.
| |
| | |
| ====Method 2:====
| |
| | |
| This method is now entirely automated with running one script inside the camera: https://github.com/apertus-open-source-cinema/beta-software/blob/master/software/scripts/rcn_validation.sh
| |
| | |
| | |
| Capture one darkframe without compensations:
| |
| ssh root@$BETA "./rcn_clear.py"
| |
| ssh root@$BETA "./cmv_snap3 -2 -b -r -e 10ms" > dark-check-1.raw12
| |
| | |
| Capture one darkframe with compensations:
| |
| ssh root@$BETA "./rcn_darkframe.py darkframe-rcn.pgm"
| |
| ssh root@$BETA "./cmv_snap3 -2 -b -r -e 10ms" > dark-check-2.raw12
| |
| | |
| | |
| Then use raw2dng to analyze the differences:
| |
| raw2dng --no-darkframe --check-darkframe dark-check-1.raw12
| |
| raw2dng --no-darkframe --check-darkframe dark-check-2.raw12
| |
| | |
| With the compensated snapshot the column noise should disappear, and only row noise left should be dynamic (not static). Visual inspection: the dark frame should have only horizontal lines, not vertical ones.
| |
| | |
| Sample output:
| |
| | |
| Average : 127.36 # about 128, OK
| |
| Pixel noise : 5.44 # this one is a bit high because we only corrected row and column offsets (it's OK)
| |
| Row noise : 2.30 (42.2%) # this one should be only dynamic row noise - see Method 3 below.
| |
| Col noise : 0.20 (3.8%) # this one is very small, that's what we need to check here
| |
| | |
| ====Method 3:====
| |
| Capture 2 frames:
| |
| ssh root@$BETA "./cmv_snap3 -2 -b -r -e 10ms" > dark-check-1.raw12
| |
| ssh root@$BETA "./cmv_snap3 -2 -b -r -e 10ms" > dark-check-2.raw12
| |
| | |
| Convert the two darkframes with raw2dng:
| |
| raw2dng dark-check-*
| |
| | |
| Make sure you have the required octave function file in place:
| |
| wget https://raw.githubusercontent.com/apertus-open-source-cinema/misc-tools-utilities/master/darkframes/read_raw.m
| |
| | |
| Also you need to install the octave "signal" and "control" packages from: http://octave.sourceforge.net/packages.php
| |
| then inside octave run to install:
| |
| pkg install package_name
| |
| | |
| To check whether the entire row noise is dynamic, load the two raw images in octave and check the autocorrelation between the two row noise samples:
| |
| | |
| pkg load signal
| |
| a = read_raw('dark-check-1.DNG');
| |
| b = read_raw('dark-check-2.DNG');
| |
| ra = mean(a'); ra = ra - mean(ra);
| |
| rb = mean(b'); rb = rb - mean(rb);
| |
| xcov(ra, rb, 0, 'coeff')
| |
| | |
| Result should be very small (about 0.1 or lower). When running this check on two uncalibrated dark frames, you will get around 0.8 - 0.9.
| |
| | |
| ==Step 3: Dark frame calibration==
| |
| | |
| Make sure the RCN calibration from previous steps is in place before continueing here.
| |
| | |
| Take 1600 dark frames at various exposure times and gains. This will require around 30GB of space on your PC.
| |
| | |
| for i in 1 2 3 4; do
| |
| for e in `seq 1 100`; do
| |
| for g in 1 2 3 4; do
| |
| ssh root@$BETA "./set_gain.sh $g"
| |
| ssh root@$BETA "./cmv_snap3 -2 -b -r -e ${e}ms" > dark-x${g}-${e}ms-$i.raw12
| |
| done
| |
| done
| |
| done
| |
| | |
| Compute dark frames for each gain:
| |
| | |
| raw2dng --calc-dcnuframe dark-x1-*.raw12
| |
| raw2dng --calc-dcnuframe dark-x2-*.raw12
| |
| raw2dng --calc-dcnuframe dark-x3-*.raw12
| |
| raw2dng --calc-dcnuframe dark-x4-*.raw12
| |
| | |
| This produces the following files:
| |
| | |
| darkframe-x1.pgm, dcnuframe-x1.pgm, darkframe-x2.pgm, dcnuframe-x2.pgm, darkframe-x3.pgm, dcnuframe-x3.pgm, darkframe-x4.pgm, dcnuframe-x4.pgm
| |
| | |
| Store these files in a save place as they will be used in post-processing.
| |
| Place them in the directory where you capture raw12 files or experimental raw HDMI recordings, so raw2dng will use them.
| |
| | |
| ===Validation===
| |
| | |
| Capture a few new raw12 darkframes with rcn enabled and PGMs in place for raw2dng.
| |
| | |
| raw2dng --check-darkframe dark*.raw12 > dark-check.log
| |
| | |
| If the calibration worked you should get lower noise values as in step 2.
| |
| | |
| average value: close to 128
| |
| | |
| pixel noise: about 3 or 4 (may increase at longer exposure times)
| |
| | |
| row noise and column noise should look similar to this:
| |
| Pixel noise : 3
| |
| Row noise : 1.70
| |
| Col noise : 0.15
| |
| | |
| ==Step 4: Color profiling==
| |
| | |
| Set gain x1.
| |
| | |
| ssh root@$BETA "./set_gain.sh 1"
| |
| | |
| Take a picture of the IT8 chart, correctly exposed.
| |
| | |
| Edit the coordinates and the raw file name in [http://github.com/apertus-open-source-cinema/misc-tools-utilities/blob/master/color-calibration/calib_argyll.sh calib_argyll.sh].
| |
| | |
| ssh root@$BETA "./cmv_snap3 -2 -b -r -e 10ms" > it8chart.raw12
| |
| ./calib_argyll.sh IT8
| |
| | |
| Save the following files:
| |
| * ICC profile (*.icc)
| |
| * OCIO configuration (copy/paste from terminal) + LUT file (*.spi1d)
| |
| | |
| ===Validation===
| |
| | |
| Render the IT8 chart in Blender, using the OCIO configuration.
| |
| | |
| Same with the ICC profile (Adobe? RawTherapee? What apps support ICC?)
| |
| | |
| (todo: detailed steps)
| |
| | |
| ==Step 5: HDMI dark frames==
| |
| For experimental 4k raw recording (https://www.apertus.org/axiom-beta-uhd-raw-mode-explained-article-may-2016) step 3 calibration is not required (step 2 should be in place though). Instead darkframes are collected from HDMI recordings.
| |
|
| |
| Record a 1-minute clip with lens cap on.
| |
| | |
| Average odd and even frames.
| |
| | |
| (todo: polish and upload the averaging script)
| |
| | |
| (todo: check if the HDMI dark frames can be computed from regular dark frames)
| |
| | |
| Results: darkframe-hdmi-A.ppm and darkframe-hdmi-B.ppm.
| |
| | |
| ==Step 6: HDMI filters for raw recovery==
| |
| | |
| This calibration is for to the recorder, not for the camera.
| |
| It's for recovering the original raw data from the HDMI, so it has nothing to do
| |
| with sensor profiling and such.
| |
| | |
| Record some scene with high detail AND rich colors.
| |
| | |
| Take a raw12 snapshot in the middle of recording. The HDMI stream will pause for a few seconds.
| |
| | |
| Upload two frames from the paused clip, together with the raw12 file.
| |
| This calibration will be hardcoded in hdmi4k.
| |
| | |
| The two frames must be in the native format of your video recorder (not DNG). You should be able to cut the video with ffmpeg -vcodec copy.
| |
| | |
| ==TODO==
| |
| | |
| * batch script to copy all the utilities for the workflow
| |
| * implement this: https://wiki.apertus.org/index.php/Calibration_files
| |
| * automate HDMI calibration
| |
| * remind Herbert to fix the line swapping bug
| |