[sane-devel] EPSON 3490, calibration and raw data

Krzysztof Halasa khc at pm.waw.pl
Sat Feb 11 12:54:22 UTC 2006


Hi,

Please forgive my ignorance, I've just started using EPSON 3490.

I'm especially interested in scanning negative 35 mm films (yes, I know
it's low-end, it's like an experiment).

Reading the sources to snapscan backend I got the impression that:
a) before the actual scanning the scanner performs white level calibration
   (and, with TPU, black level calibration).
   This is actually READ/READ_CALIBRATION and READ/READ_CALIBRATION_BLACK
   and the scanner just scans 16 lines of open area behind the actual
   film (and respectively 48 lines for black calibration, not sure where).

   The images are either 8-bit or 16-bit, but I'm not sure all bits are
   used (details?).

b) the scanned "calibration image" is averaged and a single line is sent
   back using SEND/READ_CALIBRATION and SEND/READ_CALIBRATION_BLACK.
   Not sure about 16-bit, does the values differ from 8-bit mode?

c) eventually the "analog" gamma information is uploaded to the scanner
   as well (not yet sure about details, someone?).

What do I need? I need to obtain "raw" scan data, without any calibration
or gamma correction at scanning time.

Now I have disabled READ/READ_CALIBRATION* command and the whole averaging
etc. and I'm doing SEND/READ_CALIBRATION* with the following data:
- for white: 255 0 0 0 ...
- for black: 0 0 0 0 ...

Does it disable the calibration and related calculations? The following
code fragments suggests so but the algorithm seems a bit strange (for black
and white but it essentially the same for RGB):

        /* now make averages */
        for (k = 0; k < num_bins; k++) {
            bins[k] /= cal_lines;
            /* also divide by 64 for 16bit mode */
            if (bytes_per_bin == 2)
              bins[k] /= 64;
        }

and then:

            g = 0;
            for (k = 0; k < num_bins; k++) {
                *pbuf++ = bins[k] - g;
                g = bins[k];
            }

Why the /64? Does the calibration data in 16-bit mode consist of 8-bit
samples shifted left by 6 bits (i.e., 14-bit samples with lower 6 bits
unused/ignored)?


Next thing, "analog" gamma - does setting it to 1.0 prevents scanner
firmware from doing any calculations?

Is this scanner really 48-bit (3 * 16 bit)? Can I really get full 16-bit
data from it?


Do you think adding "get raw data" option and possibly "get calibration
data" (for further processing with general image-manipulation programs)
to this backend would make sense?


Any help will be appreciated.
-- 
Krzysztof Halasa



More information about the sane-devel mailing list