2010-04-09 67 views
3

正在嘗試使用opencv中的圖像(hXw)上的3X3窗口來計算平均值和方差...這是我的代碼...是否有任何準確性問題?任何其他有效的方法一次完成。?單程圖像的均值和方差

int pi,a,b; 

for(i=1;i<h-1;i++) 
{ 
    for(j=1;j<w-1;j++) 
    { int sq=0,sum=0; 
     double mean=0; 
     double var=0; 
     for(a=-1;a<=1;a++) 
     { 
      for(b=-1;b<=1;b++) 
      { 
       pi=data[(i+a)*step+(j+b)]; 
       sq=pi*pi; 
       sum=sum+sq; 
       mean=mean+pi; 
      } 
     } 
     mean=mean/9; 
     double soa=mean*mean;//square of average 
     double aos=sum/9;//mean of squares 
     double var=aos-soa;//variance 
    } 
} 

回答

3

關於計算效率,我建議在傅里葉域中使用卷積來代替時間(圖像)域。請記住,卷積是傅立葉域中的簡單乘法。就像在時間序列中譜密度函數是作爲頻率函數分解的方差一樣,可以將其擴展到圖像的兩個維度。應該比嵌套for循環好得多。

我目前沒有編碼。但是這種技術已經用於諸如「快速模板匹配」的算法用於物體檢測或圖像配準。

+0

啊......聽起來不同的看法......你可以點亮一下嗎?或發佈通往那裏的任何鏈接...? – 2010-04-10 18:52:30

+0

好吧,這裏是以前的對話在stackoverflow: http://stackoverflow.com/questions/676709/fast-way-to-implement-2d-convolution-in-c ...我仍然會爭辯說FFT(也許是FFTW實現)是一個好主意。對快速模板匹配的參考可以在 http://www.idiom.com/~zilla/Work/nvisionInterface/nip.pdf ...其概括了用於圖像配準中的互相關方法。平均值和方差是互相關函數的組成部分,所以它就在您身邊。 – 2010-04-10 20:09:47

3

這是一個相當充分研究的主題, this Wikipedia article on variance calculations

有時候會提到的一個問題是積累的數值誤差;你需要確定這可能是一個問題。如果您計算的值在範圍內相似,則可能不太成問題。

+0

thnx爲鏈接....我認爲它更好地去與樸素算法。 – 2010-04-09 16:12:41

0

即使漂浮在如此少量的像素上,你也應該沒問題。通常情況下,如果你在整個圖像上做這種事情,你需要雙打。

0

您應該更好地使用圖像積分來快速進行局部平均值和標準偏差計算! 在這種情況下,您只需正確計算圖像各個位置的遮罩窗口邊界。它會更快。 如果您需要示例代碼,請諮詢。

+0

這將是非常有益的。我的郵件ID:[email protected] – 2010-07-03 06:32:25

+0

我怎麼可能找到一旦計算cvIntegral的本地均值?你可以請出示一些指南嗎?真的很感激它。謝謝。 – Mzk 2012-08-11 07:05:40

相關問題