matlab中自带了rgb转ycbcr的函数rgb2ycbcr.m,但是没有rgb2ycgcr.m,自己根据如下公式实现了该转换,以下代码可参考Github。
[ Y C g C r ] = [ 16 128 128 ] + [ 65.481 128.553 24.966 − 81.085 112 − 30.915 112 − 93.768 − 18.214 ] ∗ [ R G B ] \begin{bmatrix} Y \\ C_g \\ C_r \end{bmatrix} = \begin{bmatrix} 16 \\ 128 \\ 128 \end{bmatrix} + \begin{bmatrix} 65.481 & 128.553 & 24.966 \\ -81.085 & 112 & -30.915 \\ 112 & -93.768 & -18.214 \end{bmatrix} * \begin{bmatrix} R \\ G \\ B \end{bmatrix} ⎣⎡YCgCr⎦⎤=⎣⎡16128128⎦⎤+⎣⎡65.481−81.085112128.553112−93.76824.966−30.915−18.214⎦⎤∗⎣⎡RGB⎦⎤
代码如下,
function ycgcr = rgb2ycgcr(rgb)
% function ycgcr = rgb2ycgcr(rgb)
% convert rgb image to ycgcr image
% Inputs:
% rgb - rgb image
%
% Outputs:
% ycgcr - ycgcr image
% reshape image to 2d matrix
rgb = im2double(rgb);
[m, n, p] = size(rgb);
rgb_2d = reshape(rgb, m*n, p);
% convert parameters
origT = [65.481 128.553 24.966;...
-81.085 112 -30.915; ...
112 -93.768 -18.214];
origOffset = [16; 128; 128];
origOffset_2d = repmat(origOffset, 1, m*n);
% rgb to ycgcr
ycgcr = origOffset_2d + origT*rgb_2d';
ycgcr = ycgcr';
ycgcr = reshape(ycgcr, m, n, p);
end
同理,matlab中自带了rgb转hsv的函数rgb2hsv.m,但是没有rgb2hsi.m,自己根据如下代码实现了该转换。
function hsi = rgb2hsi(rgb)
% function hsi = rgb2hsi(rgb)
% Convert rgb image to hsi image.
% i = (r + g + b)/3
% s = 1 - min(r, g, b)/i
% h = arccos(0.5*(2r - g - b)/sqrt((r - g)^2 + (r - b)(g - b)))
% Inputs:
% rgb - rgb image
%
% Outputs:
% hsi - hsi image
% seperate r, g, b
rgb = im2double(rgb);
r = rgb(:, :, 1);
g = rgb(:, :, 2);
b = rgb(:, :, 3);
% implement the conversion
i = (r + g + b)/3;
s = 1 - (min(min(r, g), b)./i);
h = acos(0.5*(2*r - g - b)./sqrt((r - g).^2 + (r - b).*(g - b)));
% concatenate h, s, i
hsi = cat(3, h, s, i);