2012-10-28 152 views
8

如何從圖像積分中找到平均值,標準偏差和梯度?給定的圖像,例如,如下所示:計算圖像積分

summed area table and normal table of numbers

如上圖所示,找到了突出部分的總和,sum = C+A-B-D
所以我們有sum = 22

我怎麼能在下進行,以便找到:

  • 平均
  • 標準偏差
  • 梯度
+2

我完全不明白你的問題。你能改善它嗎? – ArtemStorozhuk

+0

您想查找某個圖像部分(ROI)的_mean_,_std dev_和_gradient_? – ArtemStorozhuk

+0

我想找到所有圖像的平均值,標準偏差和梯度。 – Mzk

回答

2

C+A-B-D爲您提供了灰度等級的總和由界的區域A,B,C,D,所以,爲了得到平均值,您只需要將區域劃分爲區域:

mean = (C+A-B-D)/4 

要獲得開發,你必須計算平方米範圍表的總和(使用cv::integral你可以傳遞一個額外的參數,以獲得平方的總和)。引用wikipedia時,標準差等於(平均值減去平均值的平方)的平方根。因此,假設A「 B」,C「 d」在你廣場面積表中的值:

dev = sqrt((C'+A'-B'-D')/4 - (mean*mean)) 

因此,在計算平均值,並使用積分圖像dev爲非常快速使用積分圖像,特別是如果你想要在隨機位置和圖像塊的隨機大小上計算這些數量。

關於漸變,它更復雜。你確定你不想使用sobel運算符嗎?

+0

你說,使用積分圖像的計算均值和開發速度尤其快速,尤其是隨機位置或大小。那麼你的意思是應用在整個圖像上會慢一些嗎? Sobel操作員是否快速? – Mzk

+0

來計算梯度,sobel是快速的,仔細實現(在頻域卷積)。如果你必須在每個像素上得到一個固定尺寸的neighbourhood的平均值,那麼使用boxFilter可能是一個好主意,也許更快,但我不確定。我認爲這將是毫秒級的問題。但是你不會以這種方式獲得開發者。當需要速度時,整體圖像是一個不錯的選擇 – remi

+0

@remi你確定公式是正確的嗎?至少是平均值?不是(C + A-B-D)/ 4嗎? – maximus

3

如果C + A-B-C是區域中的所有灰度級的總和,則平均值不

mean = C+A-B-D/4 

mean = C+A-B-D/K 

其中K是在該區域graylevels的數量。

此外,

dev = sqrt(C'+A'-B'-D'/4 - (mean*mean)) 

不是標準偏差,因爲

dev = sqrt((1/N)*sum_N (x_i - u)^2) 

這裏的公式等同於

dev = sqrt((1/N)*sum_N ((x_i)^2) - u^2) 

這些方程是不等價的。

+0

不錯的一個。謝謝@jmch。 – Mzk

+0

事實上,正如我在答案中所展示的,雷米在正確的軌道上推導出標準偏差公式,他只是偶然找到了平均值。 – xperroni

2

jmch沒有說的是,如果sqrt(C'+A'-B'-D'/K - (mean*mean))不是你如何計算積分圖像的標準偏差,那麼你怎麼做呢?

首先,讓我切換到Python/numpy的代碼,所以我們得到了一點符號一致性和表達式更容易檢查。給定樣本陣列X,說:

X = array([random() * 10.0 for i in range(0, 9)]) 

Xuncorrected sample standard deviation可以作爲被定義爲:

std = (sum((X - mean(X)) ** 2)/len(X)) ** 0.5 # 1 

運用binomial theorem(X - mean(X)) ** 2我們得到:

std = (sum(X ** 2 - X * 2 * mean(X) + mean(X) ** 2)/len(X)) ** 0.5 # 2 

鑑於identities的總和操作,我們可以做:

std = ((sum(X ** 2) - 2 * mean(X) * sum(X) + len(X) * mean(X) ** 2)/len(X)) ** 0.5 # 3 

如果我們S = sum(X)S2 = sum(X ** 2)M = mean(X)N = len(X)我們得到:

std = ((S2 - 2 * M * S + N * M ** 2)/N) ** 0.5 # 4 

現在對於圖像I和兩個積分圖像PP2I(其中P2是積分圖像的平方像素計算值),我們知道,給定四個邊緣座標A = (i0, j0),B = (i0, j1),C = (i1, j0)D = (i1, j1),值爲S,S2MN可以計算作爲範圍I[A:D]

S = P[A] + P[D] - P[B] - P[C] 

S2 = P2[A] + P2[D] - P2[B] - P2[C] 

N = (i1 - i0) * (j1 - j0) 

M = S/N 

然後可以上述(4)得到的範圍內I[A:D]的標準偏差應用到方程。

編輯:它不是完全必要的,但考慮到M = S/N我們可以將以下替換和簡化式(4):

std = ((S2 - 2 * M * S + N * M ** 2)/N) ** 0.5 

std = ((S2 - 2 * (S/N) * S + N * (S/N) ** 2)/N) ** 0.5 

std = ((S2 - 2 * ((S ** 2)/N) + (S ** 2/N))/N) ** 0.5 

std = ((S2 - ((S ** 2)/N))/N) ** 0.5 

std = (S2/N - (S/N) ** 2) ** 0.5 # 5 

這是相當接近方程式雷米了,其實。