Gamma preview instread of linear ev correction?

Started by Marsu42, March 06, 2014, 11:35:21 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Marsu42

I'd like to preview ettr'ed or (deliberately of course :-)) underexposed shots with the built-in exposure preview in qr/play mode via the cursor keys or set+wheel.

Would it be feasible and probably a minor code addition to add an option for a non-linear preview, i.e. some gamma-ish curve that keeps the black and white point where it is - or even does a contrast optimization to fill the histogram? This would be a nice preview for later postprocessing and would help me to decide if the shot is ok or I need to modify something to save work later.

a1ex

For linear gamma, you need one of those:
- reverse the picture style curve (can be done, but it's kinda ugly)
- generate the JPEG preview from the RAW buffer (like in my experiments with dual ISO preview)

The exposure adjustment operates on JPEG preview, and it does attempt to keep black and white where they are. However, the curve is applied incrementally (operates in 1-stop increments), and this causes extra artifacts (but at least it was easy to implement).

But, no matter what you do starting from Canon's JPEG image, you can't reveal highlight detail in red/blue, you will get compression artifacts, and the end result will be just a crude approximation.

Sure, the curve can be tweaked to preserve a little more highlight detail (I've noticed this too). The soft-film curve from ufraw-mod / cr2hdr should be a good starting point.

Starting from RAW would be ideal, since you could generate a customized preview that highlights focused detail, exposure and all sorts of stuff, but I have yet to find a robust hooking solution that doesn't interfere with burst shooting, doesn't slow down things too much, and doesn't feel like it's going to break like a house of cards. Not to mention portability.

OT: I wrote that feature for the same reason: I used to ETTR manually back then, and it was hard to see the images in strong sunlight.

If you want to add something like histogram equalization, I believe this one is introductory stuff in any image processing course.

Marsu42

Quote from: a1ex on March 06, 2014, 11:56:13 AM
The exposure adjustment operates on JPEG preview, and it does attempt to keep black and white where they are.

It does? Oh my, that's an oversight of my part, doesn't really seem like it :-o

This request really isn't about hq preview or processing from raw, personally I don't find this necessary as the raw histogram tells the clipping story.

I was just wondering if some gamma correction can be done with minimal effort - apparently, this might not be the case w/o further reverse engineering... though re picture styles might result in some other nice and portable features because it uses the Canon code and doesn't directly mess with the image buffer.

But if you find a quick way to add cr2hdr-ish highlight compression or something like this some other people except me could find it useful (or not, if I'm the only one +1'ing it here).

Quote from: a1ex on March 06, 2014, 11:56:13 AM
If you want to add something like histogram equalization, I believe this one is introductory stuff in any image processing course.

Thanks :-p but I'm rather familiar with the usability stuff I won't dive into image processing coding :-o

a1ex

Yes, it is already a nonlinear curve (try plotting exp_inc and exp_dec from shoot.c). It's as easy as:


octave:1> curve = [ paste numbers here ];
octave:2> plot(curve)




(looks like the soft-film curve is really close to the current ML exposure curve; now you probably want to combine it with the picture style curve for best results)

a1ex

If you want to replace the curve, here's the soft-film one:


static const uint8_t exp_inc[256] = {0x00,0x01,0x03,0x05,0x07,0x09,0x0b,0x0d,0x0f,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,0x1f,0x21,0x23,0x25,0x26,0x28,0x2a,0x2b,0x2d,0x2f,0x30,0x32,0x34,0x35,0x37,0x38,0x3a,0x3c,0x3d,0x3f,0x40,0x42,0x43,0x45,0x46,0x48,0x49,0x4b,0x4c,0x4d,0x4f,0x50,0x52,0x53,0x54,0x56,0x57,0x59,0x5a,0x5b,0x5d,0x5e,0x5f,0x61,0x62,0x63,0x65,0x66,0x67,0x68,0x6a,0x6b,0x6c,0x6d,0x6f,0x70,0x71,0x72,0x73,0x75,0x76,0x77,0x78,0x79,0x7a,0x7c,0x7d,0x7e,0x7f,0x80,0x81,0x82,0x83,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb8,0xb9,0xba,0xbb,0xbc,0xbc,0xbd,0xbe,0xbf,0xc0,0xc0,0xc1,0xc2,0xc3,0xc3,0xc4,0xc5,0xc6,0xc6,0xc7,0xc8,0xc9,0xc9,0xca,0xcb,0xcb,0xcc,0xcd,0xce,0xce,0xcf,0xd0,0xd0,0xd1,0xd2,0xd3,0xd3,0xd4,0xd5,0xd5,0xd6,0xd7,0xd7,0xd8,0xd9,0xd9,0xda,0xdb,0xdb,0xdc,0xdd,0xdd,0xde,0xde,0xdf,0xe0,0xe0,0xe1,0xe2,0xe2,0xe3,0xe3,0xe4,0xe5,0xe5,0xe6,0xe6,0xe7,0xe8,0xe8,0xe9,0xe9,0xea,0xeb,0xeb,0xec,0xec,0xed,0xed,0xee,0xef,0xef,0xf0,0xf0,0xf1,0xf1,0xf2,0xf2,0xf3,0xf4,0xf4,0xf5,0xf5,0xf6,0xf6,0xf7,0xf7,0xf8,0xf8,0xf9,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,0xfc,0xfd,0xfd,0xfe,0xff};
static const uint8_t exp_dec[256] = {0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14,0x15,0x15,0x16,0x16,0x17,0x18,0x18,0x19,0x19,0x1a,0x1b,0x1b,0x1c,0x1c,0x1d,0x1e,0x1e,0x1f,0x20,0x20,0x21,0x21,0x22,0x23,0x23,0x24,0x25,0x25,0x26,0x27,0x27,0x28,0x29,0x29,0x2a,0x2b,0x2b,0x2c,0x2d,0x2e,0x2e,0x2f,0x30,0x30,0x31,0x32,0x32,0x33,0x34,0x35,0x35,0x36,0x37,0x38,0x38,0x39,0x3a,0x3b,0x3b,0x3c,0x3d,0x3e,0x3e,0x3f,0x40,0x41,0x42,0x42,0x43,0x44,0x45,0x46,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7b,0x7c,0x7d,0x7e,0x7f,0x80,0x81,0x82,0x84,0x85,0x86,0x87,0x88,0x89,0x8b,0x8c,0x8d,0x8e,0x8f,0x91,0x92,0x93,0x94,0x96,0x97,0x98,0x99,0x9b,0x9c,0x9d,0x9f,0xa0,0xa1,0xa3,0xa4,0xa5,0xa7,0xa8,0xaa,0xab,0xac,0xae,0xaf,0xb1,0xb2,0xb3,0xb5,0xb6,0xb8,0xb9,0xbb,0xbc,0xbe,0xbf,0xc1,0xc3,0xc4,0xc6,0xc7,0xc9,0xca,0xcc,0xce,0xcf,0xd1,0xd3,0xd4,0xd6,0xd8,0xd9,0xdb,0xdd,0xdf,0xe0,0xe2,0xe4,0xe6,0xe8,0xe9,0xeb,0xed,0xef,0xf1,0xf3,0xf5,0xf7,0xf9,0xfb,0xfd,0xff};


I didn't try it; does it improve anything?

Marsu42

Quote from: a1ex on March 06, 2014, 03:56:20 PM
I didn't try it; does it improve anything?

I guess it comes down to a subjective perception - but I definitely like the soft-film curve better as it's nearly what I requested above. I only looked at a couple of shots though and did not switch back and forth between the two curves. But I'd give it a try, see for yourself and wait if someone complains :-)

Audionut

Quote from: a1ex on March 06, 2014, 11:56:13 AM
Starting from RAW would be ideal, since you could generate a customized preview that highlights focused detail, exposure and all sorts of stuff, but I have yet to find a robust hooking solution that doesn't interfere with burst shooting, doesn't slow down things too much, and doesn't feel like it's going to break like a house of cards. Not to mention portability.

Would it be worth checking the image cache to see if there is raw data in there?  Rather then trying to hook into the processes, wouldn't it be easier to grab the last cached image and process that instead?