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