1

我有一张 bmp 格式的图片,大小为 512*512。我想计算值大于 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));

同样在您的代码中,您使用>=ie 大于或等于,但您说“大于” - 选择您想要的并保持一致。

解释

那么这3行有什么作用呢?

  1. 生成一个与 where 大小相同的逻辑A矩阵trueA > 11else false
  2. 对逻辑矩阵求和,这意味着在1处处的求和值A > 11,否则为 0(布尔值转换为浮点数以进行求和)。
  3. 使用逻辑索引对矩阵 A 进行索引,并取这些值的平均值。

避免遮蔽内置函数

在您的代码中使用变量sum- 这是不好的做法,因为有一个同名的内置 matlab 函数,如果您使用同名的变量,它将变得不可用。

于 2012-08-06T16:03:14.733 回答
1

我也遇到了类似的问题,实际上解决办法在于matlabA(i,j)以最大值为255的uint8格式存储,所以,只需更改语句:

sum=sum+A(i,j);

sum=sum+double(A(i,j));

我希望这有帮助。

于 2013-05-07T07:52:11.777 回答