2016-05-23 5 views
1

こんにちは画像を読み込んだので、3Dマトリックスが作成されています。3Dマトリックスで配列をインデックスとして使用する方法は?

speeds = [20 77 55 90 87 65 67 72 55] 
invalid = speed > 70 
speeds(invalid) = 0 

これはspeedsにして、すべての無効な速度を設定します:私はベクトルのために、私はロジックテストに基づいて別のベクトルを作成することができますし、このような指標として、この他のベクターを使用することを知っている

img1 = imread('bluebird.jpg') 

しかし、私は3D行列(イメージ)でそれを行う方法を理解していません。

私がしたいのは、青の成分が3つの成分の平均(グレースケール)の平均よりも少なくとも20%高いすべての画素について、カラー成分1(赤色)と3(青色)を入れ替えることです。

img1 = imread('bluebird.jpg'); 
img2 = img1; 
m = mean(img1, 3); 
blues = img1(:,:,3) > 1.2*m; 
img2(blues, [3,2,1]) = img1(blues, [1,2,3]); 

をしかし、それは動作しませんでした:

私はこれを試してみました。変数ブルースは、私が望むピクセル(青色の支配的な要素を持つもの)を正常に取得しますが、最後の行に不正な構文があります。

私がしたいことは可能ですか?もしそうなら、どうですか?

ありがとうございます。

答えて

3

問題がある、あなたの論理配列理由2D(最初の2つのディメンションを処理する)であり、リニアインデックスは3番目のディメンションにのみ適用されます。 は論理インデックスを組み合わせることができますが、次元ごとにの配列を1つ持つ必要があります。。あなたの論理配列が現在の長さM*Nの列ベクトルになりますので、あなたのケースのために、この周り

data = magic(3); 
data([true false, true], [1 3]) 

% 8 6 
% 4 2 

簡単な方法は[M*N x 3]配列に、あなたの入力を再形成し、その後、あなたは正確に何をしたい行うことができますです。

img1 = imread('bluebird.jpg'); 

% Remember the original size 
shape = size(img1); 

% Reshape to (M*N x 3) 
img2 = reshape(img1, [], 3); 

isBlue = img2(:,3) > 1.2 * mean(img2, 2); 
img2(isBlue, [3 2 1]) = img2(isBlue, [1 2 3]); 

% Reshape it back to the original size 
img2 = reshape(img2, shape); 

インデックス作成を使用するのではなく、単にfliplrを呼び出すことができます。

img1 = imread('bluebird.jpg'); 

% Remember the original size 
shape = size(img1); 

% Reshape to (M*N x 3) 
img2 = reshape(img1, [], 3); 

isBlue = img2(:,3) > 1.2 * mean(img2, 2); 
img2(isBlue, :) = fliplr(img2(isBlue, :)); 

% Reshape it back to the original size 
img2 = reshape(img2, shape); 

これは、彼らが実際に基礎となるデータを変更しないようreshapeコマンドは非常に安いですので、3D論理行列を作成するよりもパフォーマンスになるだろう。

1

論理インデックス(行列を使用)と整数によるインデックス付けは混在できません。 代わりに、あなたが構築することができ、完全な論理的インデックス行列:代わりに、最後の2行の

img2 = rand(2, 4, 3); 
m = mean(img2, 3); 
blues = img2(:,:,3) > 1.2*m; 
f_ind = false(size(blues)); 
ind = cat(3, blues, f_ind, blues); 
img2(ind) = cat(3, img2(cat(3, f_ind, f_ind, blues)), img2(cat(3, blues, f_ind, f_ind))); 

または、:

r_ind = cat(3, blues, f_ind, f_ind); 
b_ind = cat(3, f_ind, f_ind, blues); 
img2(b_ind) = img1(r_ind); 
img2(r_ind) = img1(b_ind); 
+0

最初のステートメントは実際には真ではありません。論理*行列と整数ベースのインデックスを組み合わせることはできません。 – Suever

+0

@Sueverの説明に感謝します。そして、「整数ベース」も正しい用語です... – zeeMonkeez

1

用途:

[Y,X] = find(blues); 
inds1 = sub2ind(size(img1),Y,X,ones(length(Y),1)); 
inds2 = sub2ind(size(img1),Y,X,3*ones(length(Y),1)); 
img2([inds1,inds2]) = img1([inds2,inds1]); 
+0

こんにちは。私はあなたのコードを試して、表示される画像は元の画像と同じでした。 – Jeff

+0

ご意見ありがとうございました。私はそれを修正しました(小さな誤字がありました) – drorco

関連する問題