I've heard that in the context of long-exposure night imagery, Canon's approach is better than Nikon's Long Exp NR because Nikon's approach can "eat" stars ... not sure as that's not my thing.
I wonder if the reason for Canon to be better than Nikon for this kind of images is that Canon's black point correspond to a positive value in the RAW file, while Nikon (and most other brands) clip the RAW values to 0 for the black point.
Regarding the dark frame substraction, I was just wondering: to substract a dark frame from a regular frame could be fine for fixed pattern noise such as hot pixels, banding noise,... which would then be (nearly) cancelled. Should also work on only positive noise RAW files (all but Canon actually).
But for the Canon RAW files, that allow for negative noise with respect to the black level, a more sofisticated strategy should be done because a substraction of a negative value would mean increasing noise (5 - (-3) =
.
I was looking at DCRAW's routine for dark frame substraction:
void CLASS subtract (char *fname)
{
..FILE *fp;
..int dim[3]={0,0,0}, comment=0, number=0, error=0, nd=0, c, row, col;
..ushort *pixel;
..if (!(fp = fopen (fname, "rb"))) {
....perror (fname); return;
..}
..if (fgetc(fp) != 'P' || fgetc(fp) != '5') error = 1;
..while (!error && nd < 3 && (c = fgetc(fp)) != EOF) {
....if (c == '#') comment = 1;
....if (c == '\n') comment = 0;
....if (comment) continue;
....if (isdigitĀ©) number = 1;
....if (number) {
......if (isdigitĀ©) dim[nd] = dim[nd]*10 + c -'0';
......else if (isspaceĀ©) {
.........number = 0; nd++;
......} else error = 1;
....}
..}
..if (error || nd < 3) {
....fprintf (stderr,_("%s is not a valid PGM file!\n"), fname);
....fclose (fp); return;
..} else if (dim[0] != width || dim[1] != height || dim[2] != 65535) {
....fprintf (stderr,_("%s has the wrong dimensions!\n"), fname);
....fclose (fp); return;
..}
..pixel = (ushort *) calloc (width, sizeof *pixel);
..merror (pixel, "subtract()");
..for (row=0; row < height; row++) {
....fread (pixel, 2, width, fp);
....for (col=0; col < width; col++)
......
BAYER(row,col) = MAX (BAYER(row,col) - ntohs(pixel[col]), 0);..}
..free (pixel);
..black = 0;
}
After all checks, in the last loop it performs a simple substraction between the Bayer values from the RAW file and the values read from the dark frame file, clipping to 0 for negative results. But this subtract() function is called bofre scale_colors(), which is the function that actually substracts the black level in Canon file. So I wonder if dark frame substraction could not be optimum for Canon files in DCRAW.
EDIT: forget all those worries about the Canon dark frame substraction in DCRAW: RAW values are always positive, even for Canon. The only difference is that the black point is not 0 but a positive value in Canon (128, 256, 1024,...). So the dark frame substraction performed by DCRAW is also fine for Canon files.
Regards.