0

画像 double(800x450x3) を使用していますが、特定の条件が満たされている場合は、ピクセルの値を変更したいと考えています。しかし、私が最初に持っていたコードは機能し、良いイメージを与えてくれます。最適化しようとすると、前のケースではまったくないのに、画像が本当に奇妙な色 (赤/紫/青など) になります。

最初に私はコードを持っていました:

diff = abs(double(rgbimage) - double(backgroundImage));
fusion = zeros(size(currentFrame));
 for i=1:size(backgroundImage,1)
    for j = 1:size(backgroundImage,2)

       if diff(i,j) > 20

        fusion(i,j, :) = double(rgbimage(i,j, :));

       else
         fusion(i,j, :) = 0;  

       end
    end 
 end

そして私はそれを次のように最適化しました:

    diff = abs(double(rgbimage) - double(backgroundImage));
    fusion = zeros(size(currentFrame));    
    indexes = diff > 20;
    fusion(indexes) = double(rgbimage(indexes));

...そして、プロットした後

    subplot(2,1,1), subimage(uint8(fusion));
    title('Fusion');

違いは何ですか?なぜこのエラーが発生するのですか? ありがとう!

4

2 に答える 2

2

2つの方法が異なる理由は、forループバージョンでは、差分画像の最初の「レイヤー」のみを使用するためです(赤いコンポーネントを推測しますか?)。あなたの行if diff(i,j) > 20はとして解釈されif diff(i,j,1) > 20ます。3番目の座標がルックアップで定義されていない場合、デフォルトで。になり1ます。

最適化されたコードは、3次元データ構造のすべての要素を要素ごとに比較します。これが「奇妙な」色になる理由です。したがって、差分チェックはすべてのピクセルでローカルに行われ、色成分は考慮されません。

最適化されたバージョンでこれを試してください。

diff = abs(double(rgbimage) - double(backgroundImage));
fusion = zeros(size(currentFrame));
indexes = cat( ...
   3, ...
   diff(:,:,1) > 20, ...
   diff(:,:,1) > 20, ...
   diff(:,:,1) > 20 ...
);
fusion(indexes) = double(rgbimage(indexes));

これで、forループバージョンと同じ結果が得られるはずです。

于 2012-06-19T14:25:57.637 に答える