【问题标题】:How to generate hue from vector of RGB?如何从 RGB 向量生成色调?
【发布时间】:2019-10-30 02:50:25
【问题描述】:

我有一个来自视频的 R、G 和 B 信号向量以及帧捕获时间,每个向量大小(如R)是1 x 100 double。我想从我拥有的这些 RGB 信号向量中生成色调。我从维基百科找到它的公式,它看起来如下:

RGB.mat:下面是 R、G、B、t 的示例。每个都是 1x800 双倍的向量,我这里只包括了一个 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。 如果您可以为我也可以在我身边运行的代码提供帮助,那就太好了。

【问题讨论】:

  • ncols = length([R, G, B]); 更改为ncols = length(R);。您遇到了越界错误。
  • @beaker 谢谢你的评论。确实如此。我错了。现在修复了。我想知道您是否对我如何标准化原始色调有任何建议。谢谢。
  • 啊,那是你的问题吗?我认为H = 60 * hprime 会给你度数的答案。您还应该通过除以 255 来标准化 RGB 值。

标签: matlab colors rgb


【解决方案1】:

如果你尝试

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

x 以二维矩阵结束。然而 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 惯例。

【讨论】:

  • rgb2hsv 将颜色图作为输入(nx3 矩阵)。它不需要是 3D 数组。除此之外,您关于数据类型和限制的 cmets 是正确的。
  • @Theron 感谢您的评论。我想我可以使用您向 2d 解释的转换并解决问题。但我的意思是,我想以后可以通过平均值和标准对其进行标准化。尝试您的方法后,我将在帖子中添加更多详细信息。
  • @Bilgin。在哪里进行规范化是一个个案问题--y=(x-mean)/std,但规范化应该与数据范围分开。
  • @CrisLuengo。是的,它确实。然而RGB颜色图的范围应该落在[0, 1],这似乎不是他的情况。请参阅文档。 mathworks.com/help/matlab/ref/rgb2hsv.html
【解决方案2】:

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

给定向量 RGB,你可以这样做:

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

【讨论】:

  • 感谢您的评论。我已经从 Matlab 中心尝试过这种方法。此外,当我运行 hsv = rgb2hsv([R(:),G(:),B(:)]); 时,它给我的错误是 Error using rgb2hsv>parseInputs (line 101) Valid colormaps cannot have values outside the range [0,1]. 。我使用了R = R / 255,但我不确定它是否正确。我的观点是使用上面提到的公式来学习该过程,并且我可以进一步规范化和处理该色调信号。如果您能帮助我找到一种方法来实现我提到的代码,那就太好了。感谢您的宝贵时间。
  • @beaker 我在帖子中添加了我的整个代码,但我没有使用内置函数。我正在使用 wiki 中的数学公式,我想学习这样做。感谢您的帮助。
  • @Bilgin:确实,如果你的数据是双倍的,你需要除以255才能进入[0,1]范围,比如Theron explained in their answer。我不确定为什么您的代码有问题。我更改了ncols = numel(R),您还需要通过乘以hprime = hprime * 60 将您的数字0-6 转换为数字0-360。除此之外它可以正常工作,不是吗?
  • 感谢您的评论。我的数据确实是双倍的。 @beaker 也评论说只使用 ncols = length(R) 但我没有尝试过你的评论。我将使用您的评论并尽快更新您。我的最终目标是能够消除色调然后使其正常化,这就是为什么我要尝试向大家学习基础知识并继续前进。所有的 cmets 现在都非常有用,而且很有意义,因为我是这个领域的新手。
猜你喜欢
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
相关资源
最近更新 更多