matlab實現rgb轉ycgcr以及rgb轉hsi

matlab中自帶了rgb轉ycbcr的函數rgb2ycbcr.m,但是沒有rgb2ycgcr.m,自己根據如下公式實現了該轉換,以下代碼可參考Github

[YCgCr]=[16128128]+[65.481128.55324.96681.08511230.91511293.76818.214][RGB] \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}

代碼如下,

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);
發佈了51 篇原創文章 · 獲贊 94 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章