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