如何从RGB向量生成色相?

时间:2019-06-16 02:12:19

标签: matlab colors rgb

我具有来自视频的R,G和B信号的矢量以及帧捕获的时间,每个矢量大小,例如R1 x 100 double。我想从我拥有的这些RGB信号向量中生成色相。我从Wikipedia上找到了它的公式,它看起来简单如下:

RGB.mat:以下是R,G,B,t的示例。每个都是1x800 double的向量,这里我只包括5:

R = 12.7    15.7    15.9    15.8    15.7
G=  12.7    12.7    12.7    12.5    12.4
B = 16.4    16.1    16.1    16.0    15.9
t = 0.03    0.06    0.10    0.13    0.16

因此,我在Matlab中非常陌生,我尝试了一下,完整的代码是:

%% load R and G and B data
load('RGB.mat')
subplot(3,1,1)
plot(t,R,'r')
subplot(3,1,2)
plot(t,G,'g')
subplot(3,1,3)
plot(t,B,'b')
T1 = max([R; G; B]);
T2 = min([R; G; B]);
T3 = T1 -T2
% get hue
%R, G, B are row vectors
ncols = length([R, G, B]);
hprime = zeros(1, ncols);
for H = 1:ncols
    if T3(H) == 0
        hprime(H) = 0;
    elseif T1(H) == R(H)
        hprime(H) = mod((G(H)-B(H))/T3(H), 6);
    elseif T1(H) == G(H)
        hprime(H) = ((B(H)-R(H))/T3(H))+2;
    elseif T1(H) == B(H)
        hprime(H) = ((R(H)-G(H))/T3(H))+4;
    else
        error('undefined hue at index %d', H);
    end
end

我发现了一些类似的帖子可以回答我的问题,例如1,但是它使用的语言不是Matlab。 如果您可以在代码方面提供帮助,也可以在我的身边运行它,那将是非常不错的。

2 个答案:

答案 0 :(得分:0)

不要尝试重新发明轮子,请使用rgb2hsv

给出向量RGB即可:

hsv = rgb2hsv([R(:),G(:),B(:)]);
H = hsv(:,1);

答案 1 :(得分:0)

如果您尝试

x=[R(:),G(:),B(:)]

x最终以2D矩阵表示。但是hsv2rgb()要求输入是3D的。所以

I_rgb = zeros(1, length(R), 3);
I_rgb(:, :, 1) = R;
I_rgb(:, :, 2) = G;
I_rgb(:, :, 3) = B;
I_hsv = rgb2hsv(uint8(I_rgb));
h = I_hsv(:, :, 1);

请注意,如果不将I_rgb转换为uint8,则生成的I_hsv(:,:,3)的范围将是[0 255],而不是[0,1]。但是,如果您不将其转换为uint8而是将I_rgb预先除以255。结果范围仍然为[0,1],尽管h的范围始终相同。

这只是处理不同范围RGB的MATLAB惯例。