我想先说一下,我知道一些功能,包括 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 不同,所以乘法是不可能的,所以我的第一个问题是,我将如何调用每个像素,以便我可以单独对它们执行操作以避免这种困境。
其次,如果循环拒绝工作,如果我把它们放在“imagesc”之后什么都不会发生,如果我把它们放在“imagesc”之前,那么计算机将无法识别变量 H 是什么。末端的正确位置在哪里?