我具有来自视频的R,G和B信号的矢量以及帧捕获的时间,每个矢量大小,例如R
是1 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。 如果您可以在代码方面提供帮助,也可以在我的身边运行它,那将是非常不错的。
答案 0 :(得分:0)
答案 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惯例。