Ручное изменение RGB на HSI matlab

Я хотел бы предисловие к этому, сказав, что я знаю, что некоторые функции, включая RGB2HSI, могут сделать это за меня, но я хотел бы сделать это вручную для более глубокого понимания.

Итак, моя цель здесь - изменить мое изображение RGB на цветовую схему HSI. Изображение находится в формате .raw, и я использую следующие формулы в двоичном коде, чтобы попытаться преобразовать его.

theta = arccos((.5*(R-G) + (R-B))/((R-G).^2 + (R-B).*(G-B)).^.5);
S =  1 - 3./(R + G + B)
I = 1/3 * (R + G + B)
if B <= G H = theta if B > G H = 360 - theta

До сих пор я пробовал две разные вещи, которые привели к двум различным ошибкам. Первая попытка заключалась в следующем:

for iii = 1:196608
  C(iii) = acosd((.5*(R-G) + (R-B))/((R-G).^2 + (R-B).*(G-B)).^.5);
S(iii) = 1 - 3./(R + G + B);
I(iii) = 1/3 * (R + G + B);
end

Теперь, пытаясь это сделать, я знал, что это было крайне неэффективно, но я хотел посмотреть, был ли это жизнеспособным вариантом. Этого не произошло, и компьютеру не хватило памяти, и он отказался даже запустить его.

Моя вторая попытка была такой

fid = fopen('color.raw');
R = fread(fid,512*384*3,'uint8', 2);
fseek(fid, 1, 'bof');
G = fread(fid, 512*384*3, 'uint8', 2);
fseek(fid, 2, 'bof');
B = fread(fid, 512*384*3, 'uint8', 2);
fclose(fid);


R = reshape(R, [512 384]);
G = reshape(G, [512 384]);
B = reshape(B, [512 384]);

C = acosd((.5*(R-G) + (R-B))/((R-G).^2 + (R-B).*(G-B)).^.5);
S = 1 - 3./(R + G + B);
I = 1/3 * (R + G + B);

if B <= G
    H = B;

if B > G
    H = 360 - B;
end
end
H = H/360;

figure(1);
imagesc(H * S * I)

С этим было несколько проблем, с которыми мне нужна помощь. Прежде всего, матрица «C» имеет другие размеры, чем S, и я, поэтому умножение невозможно, поэтому мой первый вопрос: как мне вызвать каждый пиксель, чтобы я мог выполнять операции с ними индивидуально, чтобы избежать этой дилеммы.

Во-вторых, циклы if отказались работать, если я поставлю их после «imagesc», ничего не произойдет, а если я поставлю их перед «imagesc», то компьютер не распознает, какая переменная H. Где правильное размещение концов?


person user2475404    schedule 25.06.2013    source источник
comment
матрица 'C' не имеет других размеров, чем S и I   -  person fatihk    schedule 25.06.2013
comment
Я отлаживал программу, и она была 512 x 512 против S и I, которые были нормальными 512 x 384   -  person user2475404    schedule 25.06.2013
comment
Кажется, что C всегда получается частично сложным, поскольку значения внутри матрицы иногда имеют форму a + bi, может ли кто-нибудь сказать мне, почему это так? Я понимаю, что это происходит в результате увеличения знаменателя до 0,5, но почему значения приводят к отрицательному значению?   -  person user2475404    schedule 26.06.2013
comment
(R-B). * (G-B) может быть отрицательным   -  person fatihk    schedule 26.06.2013


Ответы (1)


Обычно матрица C имеет такие же размеры, как S и I, потому что:

C = acosd((.5*(R-G) + (R-B))/((R-G).^2 + (R-B).*(G-B)).^.5);

должно быть

C = acosd((.5*(R-G) + (R-B))./((R-G).^2 + (R-B).*(G-B)).^.5);

поэлементное деление посередине отсутствовало. Другой момент:

if B <= G
    H = B;

if B > G
    H = 360 - B;
end
end

должно быть

H = zeros(size(B));

H(find(B <= G)) = B(find(B <= G));
H(find(B > G)) = 360 - B(find(B > G));
person fatihk    schedule 25.06.2013
comment
Что касается второй части, я продолжаю получать следующую ошибку ??? Ошибка при использовании == ›Размеры матрицы должны совпадать. Ошибка в == ›цветах на 25 H (find (C‹ = G)) = C (find (C ‹= G)); Есть ли у вас идеи, что происходит не так? - person user2475404; 26.06.2013
comment
@ user2475404, размеры C и G могут не совпадать, вы инициализировали матрицу H как H = нули (размер (C)); ? - person fatihk; 26.06.2013