平均RGB画像を探しているのであれば、コードは正しいです。私が好きなのは、平均を累積する前にim2double
を使って画像を変換したので、すべてを作ることです。double
の精度です。 Paragが言ったように、平均画像を見つけることは、特に機械学習において非常に有用です。各ピクセルのダイナミックレンジを正規化された範囲内に収めることができるように画像分類を行う前に、画像のセットの平均画像を見つけることは一般的である。これにより、学習アルゴリズムを訓練して最適解にすばやく収束させ、最良の分類精度を実現するための最適なパラメータセットを提供することができます。
あなたは、すべての画像の平均色である平均RGBカラーを見つけたい場合は、何もあなたのコードが正しくないではありません。
sumrgbims
に保存されているすべてのチャンネルを個別に合計しているため、最後に行う必要があるのはこの画像と各チャンネルの個別の合計です。第1および第2次元のsum
への2回のコールは、一緒にチェーンされています。これにより1 x 1 x 3
ベクトルが生成されます。この後にsqueeze
を使用してシングルトンのディメンションを削除し、すべてのイメージの平均RGBカラーを表す3 x 1
ベクトルを取得します。したがって
:
mean_colour = squeeze(sum(sum(sumrgbims, 1), 2));
あなたの2番目の質問に対処するため、私はあなたがすべての画像にわたる各画素値の標準偏差を見つけたいと仮定しています。あなたがしなければならないことは、ループ内に各画像を蓄積することに加えて、各画像のの正方形を蓄積することです。その後、標準偏差は分散の平方根であり、分散は平均平方和から平均平方和を差し引いたものに等しいことがわかります。私たちは平均画像を持っています。今度は、平均画像を2乗し、これを平均平方和で減算するだけです。信号がX
で、平均がmu
であると仮定して、数式が正しいことを確認してください。
Variance http://www.cdn.sciencebuddies.org/Files/475/9/DerivVarEqn.jpg
出典::私たちは私たちの信号でN
値を持っていることを考えると、分散はすることが等しいScience Buddies
標準偏差は、単に上記の結果の平方根になります。このようにして、各画素ごとにこれを独立して計算する。したがって、あなたはあなたのためにそれを行うには、あなたのループを変更することができます:最小値は0にマッピングされますと、最大値が1にマッピングされるよう
また
filelist = dir('set1/*.jpg');
sumrgbims = zeros(215, 300, 3);
sum2rgbims = sumrgbims; % New - for standard deviation
for i=1:length(filelist)
imname = ['set1/' filelist(i).name];
rgbim = im2double(imread(imname));
sumrgbims = sumrgbims + rgbim;
sum2rgbims = sum2rgbims + rgbim.^2; % New
end
rgbavgset1 = sumrgbims/length(filelist);
% New - find standard deviation
rgbstdset1 = ((sum2rgbims/length(filelist)) - rgbavgset.^2).^(0.5);
figure;
imshow(rgbavgset1, []);
% New - display standard deviation image
figure;
imshow(rgbstdset1, []);
を確認するために、私は、各imshow
コールの表示を拡大縮小しましたこれはイメージの実際の内容を変更しません。これは表示用です。
あなたはこれが間違っていると思いますか?すべての画像のR、G、Bチャンネルを平均しています。 – Suever
今日の世界では、画像を深いネットワークに送る前に画像を前処理するために多用されています。それを正規化と考えてください。 –
@Suever私は自分の質問を更新しました、私はRGBチャネルの平均を取っていないので、私は混乱しています。 – user2769614