matlab中自帶了rgb轉ycbcr的函數rgb2ycbcr.m,但是沒有rgb2ycgcr.m,自己根據如下公式實現了該轉換,以下代碼可參考Github。
代碼如下,
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);