Experiment with changing the surface reflectances in the image

We use convolution by different kernels to blur the surface reflectance functions. The original motivation is to control the image gamut by blurring the reflectance functions so they become more neutral (e.g., Gaussian blur).

Convolving with a sharpening filter is also illustrated. And once you get started, the possibility of changing the gamut by multiplying with with a general vector (which could be grouped into the light) also arises.

There are many ways to change the reflectances by many other possible transforms that either reduce or expand the gamut in different ways. This script illustrates the first and simplest methods.

Copyright Imageval Consulting, LLC 2015

Contents

ieInit

Choose a scene

% Colorful chart
s = sceneCreate('reflectance chart');
ieAddObject(s); sceneWindow;

Get the reflectance functions and blur them with a gaussian

r = sceneGet(s,'reflectance');
[r, row, col] = RGB2XWFormat(r);

% The Gaussian  moves everything towards neutral.
% The red-green collapses much faster than the blue-yellow
g = fspecial('gaussian',[1,9],3);

% Blur a few times
r3 = conv2(r,g,'same');
nLoops = 5;
for ii=1:nLoops
    r3 = conv2(r3,g,'same');
end
r3 = XW2RGBFormat(r3,row,col);

% Store the result
s2 = sceneAdjustReflectance(s,r3);
s2 = sceneSet(s2,'name','Gaussian');
sceneWindow(s2);

Show the the modified scene

% You could look at the shift in the xy chromaticities this way
%
% rect = [1 1 row-1 col-1];
% scenePlot(s2,'chromaticity roi',rect);
% scenePlot(s,'chromaticity roi',rect);

% Compare the original and the desaturated
imageMultiview('scene',[1 2],true);

Convolve the original reflectances with a DoG

r = sceneGet(s,'reflectance');
[r, row, col] = RGB2XWFormat(r);

% Reflectance sharpened
g = [0 -.2 .2 .5 ,2 -.2 0]; g = g/sum(g(:));

% Repeat a small number of times
r3 = conv2(r,g,'same');
nLoops = 2;
for ii=1:nLoops
    r3 = conv2(r3,g,'same');
end
r3 = XW2RGBFormat(r3,row,col);
r3 = ieClip(r3,0,1);
s3 = sceneAdjustReflectance(s,r3);
s3 = sceneSet(s3,'name','DoG');
ieAddObject(s3); sceneWindow;

% rect = [1 1 row-1 col-1];
% scenePlot(s3,'chromaticity roi',rect);

Compare the original and the sharpened image

imageMultiview('scene',[1 3],true);