0

我想先说一下,我知道一些功能,包括 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 是什么。末端的正确位置在哪里?

4

1 回答 1

2

通常,矩阵“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));
于 2013-06-25T17:38:25.990 回答