From a33f36b824b48b4921c45d7fe537bd37ec27d0b2 Mon Sep 17 00:00:00 2001
From: Elian Dib <elian.dib@inria.fr>
Date: Tue, 27 Nov 2018 09:35:27 +0100
Subject: [PATCH] Fixed scaling when converting to double

---
 rgb2ycbcr.m | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/rgb2ycbcr.m b/rgb2ycbcr.m
index c173a30..1c5a925 100644
--- a/rgb2ycbcr.m
+++ b/rgb2ycbcr.m
@@ -1 +1 @@
-% Author :  Hadi Amirpour 
% email  :  hadi.amirpour@gmail.com
% Copyright(c) EmergIMG,
%              Universidade da Beira Interior

% script for RGB 444 to YCbCr 444 color space conversion in n bits
% Input: 
        % 1-rgb   ---> RGB image in double format
        % 2-n     ---> number of the bits, this number should be either 8 or 10

% Output: 
        % 1-ycbcr ---> YCbCr image in n bits
% Modified by Elian Dib (elian.dib@inria.fr) on October, 18th 2018

function [ycbcr] = rgb2ycbcr(rgb,n,fullRange,conv2int)

%  Recommendation ITU-R BT.709-6
M = [ 0.212600   0.715200  0.072200 ;
     -0.114572  -0.385428  0.500000 ;
      0.500000  -0.454153 -0.045847];
  
if (nargin < 2)
    if isinteger(rgb)
    [~,n] = utils.precision(class(rgb));
    else
        n = 0;
    end
end

if (nargin < 3)
    fullRange = true;
end

if (nargin < 4)
    if isinteger(rgb)
        conv2int = true;
    else
        conv2int = false;
    end
end

if isinteger(rgb)
    rgb = double(rgb)./double(intmax(class(rgb)));
end

if fullRange
    offsetY = 0;
    scaleY = 255;
    offsetC = 128;
    scaleC = 255;
else
    offsetY = 16;
    scaleY = 219;    
    offsetC = 128;
    scaleC = 224;
end

ycbcr        = reshape(double(rgb), [], 3) * M';
ycbcr(:,1)   = (scaleY*ycbcr(:,1)   + offsetY)*2^(n-8);
ycbcr(:,2:3) = (scaleC*ycbcr(:,2:3) + offsetC)*2^(n-8);
ycbcr        = reshape(ycbcr, size(rgb));

if conv2int
    if(n<=8)
        ycbcr = uint8(ycbcr);
    elseif (n<=16)
        ycbcr = uint16(ycbcr);
    elseif (n<=32)
        ycbcr = uint32(ycbcr);
    elseif (n<=64)
        ycbcr = uint64(ycbcr);
    else
        print('invalid bit depth')
    end
end
end
\ No newline at end of file
+% Author :  Hadi Amirpour 
% email  :  hadi.amirpour@gmail.com
% Copyright(c) EmergIMG,
%              Universidade da Beira Interior

% script for RGB 444 to YCbCr 444 color space conversion in n bits
% Input: 
        % 1-rgb   ---> RGB image in double format
        % 2-n     ---> number of the bits, this number should be either 8 or 10

% Output: 
        % 1-ycbcr ---> YCbCr image in n bits
% Modified by Elian Dib (elian.dib@inria.fr) on October, 18th 2018

function [ycbcr] = rgb2ycbcr(rgb,n,fullRange,conv2int)

%  Recommendation ITU-R BT.709-6
M = [ 0.212600   0.715200  0.072200 ;
     -0.114572  -0.385428  0.500000 ;
      0.500000  -0.454153 -0.045847];
  
if (nargin < 2)
    if isinteger(rgb)
    [~,n] = utils.precision(class(rgb));
    else
        n = 0;
    end
end

if (nargin < 3)
    fullRange = true;
end

if (nargin < 4)
    if isinteger(rgb)
        conv2int = true;
    else
        conv2int = false;
    end
end

rgb = double(rgb)./double(2^n-1);

if fullRange
    offsetY = 0;
    scaleY = 255;
    offsetC = 128;
    scaleC = 255;
else
    offsetY = 16;
    scaleY = 219;    
    offsetC = 128;
    scaleC = 224;
end

ycbcr        = reshape(double(rgb), [], 3) * M';
ycbcr(:,1)   = (scaleY*ycbcr(:,1)   + offsetY)*2^(n-8);
ycbcr(:,2:3) = (scaleC*ycbcr(:,2:3) + offsetC)*2^(n-8);
ycbcr        = reshape(ycbcr, size(rgb));

if conv2int
    if(n<=8)
        ycbcr = uint8(ycbcr);
    elseif (n<=16)
        ycbcr = uint16(ycbcr);
    elseif (n<=32)
        ycbcr = uint32(ycbcr);
    elseif (n<=64)
        ycbcr = uint64(ycbcr);
    else
        print('invalid bit depth')
    end
end
end
\ No newline at end of file
-- 
GitLab