Как сгенерировать оттенок из вектора RGB? - PullRequest
0 голосов
/ 16 июня 2019

У меня есть вектор сигналов R, G и B из видео вместе с временем захвата кадра, и каждый размер вектора, такой как R, равен 1 x 100 double.Я хочу генерировать оттенок из этих векторов сигналов RGB, которые у меня есть.Я нахожу формулу для нее из Википедии, и она просто выглядит следующим образом:

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 голосов
/ 17 июня 2019

Если вы попробуете

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

x заканчивается двумерной матрицей. Тем не менее, hsv2rgb () требует, чтобы вход был трехмерным. Так

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 всегда будет одинаковым.

Это просто соглашение MATLAB о работе с RGB в разных диапазонах.

0 голосов
/ 16 июня 2019

Не пытайтесь заново изобретать колесо, используйте rgb2hsv.

Для заданных векторов R, G и B вы можете сделать:

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