Я хотел бы предисловие к этому, сказав, что я знаю, что некоторые функции, включая 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. Где правильное размещение концов?