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

これまでのところ、2 つの異なることを試しましたが、2 つの異なるエラーが発生しました。最初に試みたのは次のとおりです。

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

これを試みてみると、非常に非効率的であることがわかりましたが、それが実行可能なオプションであるかどうかを確認したかったのです。そうではなく、コンピューターのメモリが不足し、実行することさえ拒否しました。

私の2回目の試みはこれでした

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 が何であるかを認識しませんでした。端の正しい配置はどこですか?

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 に答える