【问题标题】:count and average certain pixels in image with MATLAB使用 MATLAB 计算和平均图像中的某些像素
【发布时间】:2012-08-03 14:22:37
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    为什么你的代码不起作用

    很难说,你能用类似的东西来显示你的矩阵的一部分和大小吗

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

    只是为了确保A 的格式符合您的预期 - 如果图像以彩色读取,imread 可能会给您一个512x512x3 矩阵,或者图像可能在区间 [0,1 ]。

    更好的方法

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

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

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

    说明

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

    1. 生成一个逻辑矩阵,大小与A 相同,即true 无论A > 11,否则为false
    2. 对逻辑矩阵求和,这意味着在 A > 11 的任何地方求和的值都是 1,否则为 0(此求和的布尔值转换为浮点数)。
    3. 使用logical indexing 对矩阵A 进行索引,并取这些值的平均值。

    避免阴影内建

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

    【讨论】:

      【解决方案2】:

      我也遇到过类似的问题,其实解决的办法是matlab以uint8格式存储A(i,j),最大值为255,所以,改一下语句:

      sum=sum+A(i,j);
      

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

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-19
        • 1970-01-01
        • 2013-04-24
        • 1970-01-01
        • 2020-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多