2016-11-25 9 views
1

MATLABの3D配列に1次元スライスを割り当てるにはどうすればよいですか?Matlab 3D配列の1Dスライスの割り当て

私は、設定したい3次元画像マトリックス(RGBフォーマット)のピクセルに対応する論理的な2次元配列 'CD'を持っています。

CD = any(d, 3); 
CDM(CD) = 255; 

そこで、この場合には、 'CDM' は(例えば、それは771x457x3マトリックス'S)画素毎にR、G、B値を含む3Dマトリックスです。

上記のコードは機能します。私はそれらを必要とする赤いピクセルのイメージを生成します。

ここで、緑やシアンのピクセルを生成したいとします。 「CDM」の2番目と3番目の「レイヤー」(緑と青の値)にアクセスするにはどうすればよいですか?私は

CDM(CD) = [0 255 255]; 

を割り当てる試みたが、これはそのような2次元アレイと、各チャネルを変更するためにエラー

In an assignment A(:) = B, the number of elements in A and B must be the same. 

答えて

2

を返し、次の(2次元アレイのような)各チャネルを取得する必要があり、その後、使用します2D論理アレイを使用して、目的のピクセルを目的の値に置き換えてから、アレイに戻します。

green = CDM(:,:,2); 
green(CD) = 255; 
CDM(:,:,2) = green; 

また、問題をベクトル化するために、次のようにすることもできます。

replace_color = [0 255 255]; 
CDM = bsxfun(@times, ~CD, CDM) + bsxfun(@times, CD, reshape(replace_color, [1 1 3])) 

説明

まず我々は寸法放送を行い、論理行列の逆(~)とCDM内の各RGB画素を乗算するbsxfunを使用します。これにより、1のピクセルがすべてCDから0に設定され、その他のピクセルはすべて元の値のままになります(1が乗算されるため)。

bsxfun(@times, ~CD, CDM) 

CD1た各RGBベクトルは所望のRGB値である我々は、次に、M×N個×3アレイを生成するために(1×1×3アレイであることが再形成)新しい色でCDを乗算とそれ以外の値は0です。

bsxfun(@times, CD, reshape(replace_color, [1 1 3])) 

私たちは、その後、CD0だったとCD1たところはどこでも新しい値でRGB値を置き換えるどこRGB値を維持するために一緒にこれら二つを追加します。

後でR2016bにしている場合、または、あなたはbsxfunを削除することができ、その溶液は次のように単純化されます。

CDM = (~CD .* CDM) + (CD .* reshape(replace_color, [1 1 3])); 
+0

働いていたすべての3つのソリューション!本当に素晴らしい答え、ありがとう。 –

+0

R2016では何が違うのですか?「bsxfun'を削除できますか?」 – Floris

+0

2016は、配列操作(?)のためのシングルトン次元の自動展開を行います。これは 'bsxfun'の機能です。 – stephematician

関連する問題