2017-02-07 7 views
1

私は画像解析を学習し、カラー画像の平均設定しようとし、各画素カラー画像の平均セットと標準偏差

で標準偏差を取得しています私はこれを行っているが、それはRGBチャンネルを平均化することによってではありません。 (例:rchannel = I(:、:、1))

filelist = dir('dir1/*.jpg'); 
ims = zeros(215, 300, 3); 
for i=1:length(filelist) 
    imname = ['dir1/' filelist(i).name]; 
    rgbim = im2double(imread(imname)); 
    ims = ims + rgbim; 
end 

avgset1 = ims/length(filelist); 
figure; 
imshow(avgset1); 

これが正しいかどうかわかりません。画像の平均化がどのように役立つのか混乱しています。 また、標準偏差を保持する行列を得ることができませんでした。

何か助けていただければ幸いです。

+0

あなたはこれが間違っていると思いますか?すべての画像のR、G、Bチャンネルを平均しています。 – Suever

+0

今日の世界では、画像を深いネットワークに送る前に画像を前処理するために多用されています。それを正規化と考えてください。 –

+0

@Suever私は自分の質問を更新しました、私はRGBチャネルの平均を取っていないので、私は混乱しています。 – user2769614

答えて

3

平均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コールの表示を拡大縮小しましたこれはイメージの実際の内容を変更しません。これは表示用です。

関連する問題