手动将RGB更改为HSI matlab

时间:2013-06-25 17:10:21

标签: matlab rgb

我想先说一下,我知道一些功能,包括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)

我需要帮助,这有几个问题。首先,矩阵&#39; C&#39;与S和I有不同的尺寸,因此乘法是不可能的,所以我的第一个问题是,我如何调用每个像素,以便我可以单独对它们执行操作以避免这种困境。

其次if循环拒绝工作,如果我把它们放在&#34; imagesc&#34;什么都不会发生,如果我把它们放在&#34; imagesc&#34;然后计算机无法识别H是什么变量。两端的正确位置在哪里?

1 个答案:

答案 0 :(得分: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));