2016-04-12 61 views
0

私は3 480行x 640列の画像を持っています。各画素は輝度値を保持する。Matlabのセル要素を1つのベクトルに結合する

私はこれにMATLABでそれらを読む:3パット= 1今

object_intensities = cell(1,6); 
    for pat=1:3 
     file1 = sprintf('image%d.pgm',pat-1); 
     dummy = double(imread(file1)); 
     object_intensities{pat} = dummy; 
    end 

、object_intensitiesはobject_intensitiesの各電池要素{特許}は480×640のマトリックスアレイ内の各画像を保持するようにセルアレイであります。実行する方法

structure{row 1, column 1} = [image1_intensity @ row1 column1 image2_intensity @ row1 column1 image3_intensity @ row1 column1] 
structure{row 1, column2} = [image1_intensity @ row1 column2 image2_intensity @ row1 column2 image3_intensity @ row1 column2] 
. 
. 
structure{row 480, column 640} = [image1_intensity @ row480 column640 image2_intensity @ row480 column640 image3_intensity @ row480 column640] 

は今は必要な各セル要素は、このような単一のベクター内の各画像ピクセルの3つの強度を含むように480行×640列である単一構造でありますこれはループを使用せずにベクトル化を使用しますか?

+0

は、RGBチャンネルのための3つの画像強度はありますか?または、「object_intensities」の各セルは実際には* 480 * -by- * 640 * -by- * 3 *行列を保持するか?実際には単一のチャンネルイメージを保持している場合( 'imread'を使用していると疑わしい場合は、最初にグレースケールに変換する必要があります)、' cat(3、object_intensities {:}) 'を試してみると、素晴らしい* 480 * -by- * 640 * -by- * 3 *行列です。しかし、基本的に画像を読むときに、ちょうどそれをやったことがあると思います。これは、通常のマトリックスと比較して動作するのは本当に難しいでしょう。 – Dan

+0

イメージはすでにグレースケールです。 このデータ構造では、各画像ピクセルの強度シーケンスが必要なので、私はこれを説明したいと思います。 – user1431515

+0

3Dマトリックスは依然として優れていますが、セル配列は扱うのがはるかに難しいです。また、グレースケールであるかどうかにかかわらず、 'imread'が画像RGBをデフォルトで作ることを確信しています。それでも変換は必要です。 – Dan

答えて

1

問題のデータ構造が必要です。むしろ、第3次元があなたの強さを(順番に)マッピングする3Dマトリックスを使用してください。ラインを使って作業する方がはるかに簡単です。私はあなたがこのようにそれを作成することをおすすめ

object_intensities = zeros(480,640,3); 
for pat=1:3 
    file1 = sprintf('image%d.pgm',pat-1); 
    object_intensities(:,:,pat) = rgb2gray(imread(file1)); 
end 

は、今すぐあなたの構造上のobject_intensities{i,j}あったであろうものをただobject_intensities(i,j,:)であり、あなたが本当にあなたに必要がある場合、それの行にするsqueezeまたはpermuteまたは(:)'を呼び出すことができますベクター。しかし、単にそれはピクセルあたりの平均強度を見つけるような何かをすることになりましたがどのようにはるかに簡単だと思いますが、行ごとの平均を望んでいた場合はセル配列

cellfun(@mean,object_intensities,'uni',0) %// Just a loop in disguise 

そして、何と比較して

mean(object_intensities,3) 

mean(object_intensities,2) 

セル配列に対してこれを行うと、なぜそれを避けたいのかがわかります。

しかし、あなたは本当にあなたの構造をしたい場合は、上記のように私のコードを使用して、3Dマトリックス上mat2cellを呼び出す:

mat2cell(object_intensities, ones(size(object_intensities,1),1), ones(1,size(object_intensities,2)),3) 
+0

私は答えを感謝しますが、私は平均や他の操作を見つけることはありません。 私が扱っているレガシーコードでは、オリジナルの投稿に必要なデータ構造が最適です。 – user1431515

+0

@ user1431515私はまだそれを疑う。しかし、上記のコードを['mat2cell'](http://www.mathworks.com/help/matlab/ref/mat2cell.html)と組み合わせて、あなたの望む構造にしてください。明らかに「平均値」は単なる説明に過ぎず、これらのデータを使用したいと思うほとんどすべてに適用されます。 – Dan

+0

私が480x640x3行列の行250を使用しているとしましょう。私の画像シーケンスの行250を表す3x640のマトリックスが可能ですか? – user1431515

関連する問題