Image 用MATLAB对图像中的某些像素进行计数和平均
我有一张bmp格式的图像,大小为512*512。我想计算值大于11的像素数,然后求这些像素的平均值。这是我的密码。我不知道是什么问题,但像素值的总和是错误的,它总是255。我尝试了不同的图像 你能帮我弄清楚吗Image 用MATLAB对图像中的某些像素进行计数和平均,image,matlab,image-processing,for-loop,count,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;
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)
为什么你的代码不起作用
很难说,你能用类似的方式显示矩阵的一部分和大小吗
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));
同样在代码中,您使用>=即大于或等于,但您说“大于”-选择您想要的并保持一致
解释
那么这三条线是做什么的呢
生成一个逻辑矩阵,其大小与a相同,a>11时为真,否则为假。
对逻辑矩阵求和,这意味着在A>11的地方求和值都是1,否则0个布尔值将被转换为该求和的浮点值。
使用索引到矩阵A,并取这些值的平均值。
避免遮挡内置物
在您的代码中使用变量sum-这是一种糟糕的做法,因为有一个内置的matlab函数具有相同的名称,如果使用相同名称的变量,该函数将变得不可用 为什么您的代码不起作用
很难说,你能用类似的方式显示矩阵的一部分和大小吗
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));
同样在代码中,您使用>=即大于或等于,但您说“大于”-选择您想要的并保持一致
解释
那么这三条线是做什么的呢
生成一个逻辑矩阵,其大小与a相同,a>11时为真,否则为假。
对逻辑矩阵求和,这意味着在A>11的地方求和值都是1,否则0个布尔值将被转换为该求和的浮点值。
使用索引到矩阵A,并取这些值的平均值。
避免遮挡内置物
在您的代码中使用变量sum-这是一种糟糕的做法,因为有一个内置的matlab函数具有相同的名称,如果使用相同名称的变量,该函数将变得不可用 我也遇到了类似的问题,事实上,解决方案在于matlab以uint8格式存储Ai,j,其最大值为255,因此,只需更改语句:
sum=sum+A(i,j);
到
我希望这会有所帮助。我也遇到了类似的问题,事实上,解决方案在于matlab以uint8格式存储Ai,j,其最大值为255,因此,只需更改语句:
sum=sum+A(i,j);
到
我希望这有帮助