Scanner grayscale vs color images

color image: kitchen1.tif

grayscale image: kitchen2.tif

Image Difference

gray = im2double(imread('kitchen2.tif'));
rgb = im2double(imread('kitchen1.tif'));
diff = gray - rgb2gray(rgb);
a = [ max(diff(:)) min(diff(:)) ]
rms = std2(diff)

Matlab results

a =

    0.0935   -0.0390

rms =

    0.0111

Histograms

cdiff = (diff+1)/2;
imhist(cdiff);

[counts,x] = imhist(cdiff);
stem(x(110:150),counts(110:150));

Scaled image difference

cdx = (diff - a(2))/(a(1)-a(2));
imshow(cdx)
imwrite(cdx,'cdx.jpg');

Difference Statistics

mean -0.0036
stdev 0.0111
max 0.0353
min -0.0941
max-min 0.1294

rgb2gray.m

type rgb2gray.m

function a = rgb2gray(r,g,b)
%RGB2GRAY Convert RGB image or colormap to grayscale.
%   RGB2GRAY converts RGB images to grayscale by eliminating the
%   hue and saturation information while retaining the
%   luminance.
%
%   I = RGB2GRAY(RGB) converts the truecolor image RGB to the
%   grayscale intensity image I.
%
%   NEWMAP = RGB2GRAY(MAP) returns a grayscale colormap
%   equivalent to MAP.
%
%   Class Support
%   -------------
%   If the input is an RGB image, it can be of class uint8 or
%   double; the output image I is of the same class as the input
%   image. If the input is a colormap, the input and output
%   colormaps are both of class double.
%
%   See also IND2GRAY, NTSC2RGB, RGB2IND, RGB2NTSC.

%   Clay M. Thompson 9-16-92
%   Copyright (c) 1993-97 by The MathWorks, Inc.
%   $Revision: 5.8 $  $Date: 1997/03/11 18:32:12 $

if nargin==0,
  error('Need input arguments.');
end
threeD = (ndims(r)==3); % Determine if input includes a 3-D array 

if nargin==1,
  if threeD,
    rgb = reshape(r(:),size(r,1)*size(r,2),3);
    a = zeros([size(r,1), size(r,2)]);
  else % Colormap
    rgb = r;
    a = zeros(size(r,1),1);
  end

elseif nargin==2,
  error('Wrong number of arguments.');

else
  if (any(size(r)~=size(g)) | any(size(r)~=size(b))),
    error('R, G, and B must all be the same size.')
  end
  rgb = [r(:), g(:), b(:)];
  a = zeros(size(r));
end

T = inv([1.0 0.956 0.621; 1.0 -0.272 -0.647; 1.0 -1.106 1.703]);

if isa(rgb, 'uint8')  
    a(:) = uint8(double(rgb)*T(1,:)');
else
    a(:) = rgb*T(1,:)';
end

if ((nargin==1) & (~threeD)),    % rgb2gray(MAP)
    if isa(a, 'uint8')
        a = double(a)/255;
    end
    a = [a,a,a];
end


T = inv([1 0.956 0.621; 1 -0.272 -0.647; 1 -1.106 1.703])

T =

    0.2989    0.5870    0.1140
    0.5959   -0.2744   -0.3216
    0.2115   -0.5229    0.3114

T(1,:)

ans =

    0.2989    0.5870    0.1140


Maintained by John Loomis, last updated 27 May 1998