2012-08-06 328 views
1

我有一個bmp格式的圖像,大小爲512 * 512。我想計算值大於11的像素數量,然後找出這些像素的平均值。這是我的代碼。我不知道是什麼問題,但像素值的總和是錯誤的,它始終是255.我嘗試了不同的圖像。使用MATLAB計算並平均圖像中的某些像素

你能幫我弄清楚嗎?

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) 

回答

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矩陣。

更好的方法

一旦你確定矩陣的確是512×512,並具有上述11值,你最好通過產生屏蔽,即

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

此外,在你使用的代碼>=即大於或等於,但你說'大於' - 選擇你想要的並保持一致。

說明

那麼這些三線嗎?

  1. 生成邏輯矩陣,大小相同Atrue無論A > 11,否則false
  2. 求和邏輯矩陣,這意味着總和值爲1無論哪處A > 11,否則0(布爾值轉換爲浮點數以進行此求和)。
  3. 使用logical indexing索引到矩陣A,並取這些值的平均值。

避免陰影內建

在你的代碼使用變量sum - 這是不好的做法,因爲是同一個名字,如果你使用的一個變量,它變得無法使用一個內置的matlab函數一樣的名字。

1

我也面臨類似的問題,實際上解決之道在於一個事實,即MATLAB店A(i,j)在UINT8格式,其最大值爲255,所以,只需更改聲明:

sum=sum+A(i,j); 

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

我希望這有助於。

相關問題