使用MATLAB对图像中的某些像素进行计数和平均

时间:2012-08-06 15:26:25

标签: image matlab image-processing for-loop count

我有一个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)

2 个答案:

答案 0 :(得分:7)

为什么代码不能正常工作

很难说,你能用

之类的东西显示矩阵的一部分和大小吗?
disp(A(1:10,1:10))
disp(size(A))
% possibly also the min and max...
disp(min(A(:))
disp(max(A(:))

只是为了确保A的格式符合您的预期 - imread如果图片是彩色的,或者图片可能在区间[0,1]。

更好的方法

一旦你确定矩阵确实是512x512,且值大于11,你最好通过生成一个掩码,即

512x512x3

同样在您的代码中,您使用mask = A > 11; numabove11 = sum(mask(:)); avabove11 = mean(A(mask)); ,即大于或等于,但您说'大于' - 选择您想要的并保持一致。

<强>解释

那么这三条线做了什么?

  1. 生成一个逻辑矩阵,其大小与>=相同,A只有true,否则A > 11
  2. 对逻辑矩阵求和,这意味着false处的1的和值,否则为0(对于此求和,布尔值将转换为浮点数)。
  3. 使用logical indexing索引到矩阵A,并取这些值的平均值。
  4. 避免影响内置

    在你的代码中使用变量A > 11 - 这是不好的做法,因为有一个内置的matlab函数具有相同的名称,如果你使用同名的变量,它将变得无法使用。

答案 1 :(得分:1)

我也面临类似的问题,实际上解决方案在于matlab以最大值为255的uint8格式存储A(i,j),所以,只需更改语句:

sum=sum+A(i,j);

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

我希望这会有所帮助。