1

サイズが512*512のbmp形式の画像が1つあります。値が11を超えるピクセルの数を数え、これらのピクセルの平均を求めたいと思います。これが私のコードです。何が問題なのかわかりませんが、ピクセル値の合計が間違っていて、常に255です。別の画像で試してみました。

それを理解するのを手伝ってくれませんか。

A=imread('....bmp');

sum=0; count=0;

for i=1:512    
   for j=1:512
      if (A(i,j)>=11)
        sum=sum+A(i,j);
        count=count+1;
      end
   end
end

disp('Number of pixels grater than or equal to 11')
disp(count)

disp('sum')
disp(sum)

disp('Average')
Avrg=sum/count;
disp(Avrg)
4

2 に答える 2

7

コードが機能しない理由

わかりにくいですが、次のようなものを使用して、マトリックスの一部とサイズを表示できますか

disp(A(1:10,1:10))
disp(size(A))
% possibly also the min and max...
disp(min(A(:))
disp(max(A(:))

の形式がA期待どおりであることを確認するために-画像がカラーで読み取られた場合、または画像が[0,1]の間隔にある可能性がある場合はimread、行列を与えることができます。512x512x3

より良いアプローチ

マトリックスが実際に 512x512 であり、値が 11 を超えていることを確認したら、マスクを生成するのが最善です。

mask = A > 11;
numabove11 = sum(mask(:));
avabove11 = mean(A(mask));

また、コードで>=は「より大きいか等しい」を使用しますが、「より大きい」と言います-必要なものを選択して一貫性を保ちます。

説明

では、これらの 3 行は何をしているのでしょうか。

  1. それと同じサイズの論理行列をA生成trueA > 11ますfalse
  2. 1論理行列を合計します。これは、どこにでもある合計値を意味しA > 11、それ以外の場合は 0 です (ブール値は、この合計のために float に変換されます)。
  3. 論理インデックスを使用して行列 A にインデックスを付け、それらの値の平均をとります。

ビルトインのシャドウイングを避ける

コードでは変数を使用しますsum。同じ名前の組み込みの matlab 関数があり、同じ名前の変数を使用すると使用できなくなるため、これは悪い習慣です。

于 2012-08-06T16:03:14.733 に答える