我有大量图像,想计算所有图像的(每个通道的)方差。 我在为此找到有效的算法/设置时遇到问题。
我阅读了 Welford 的在线算法,但它的速度很慢,因为它没有以这种形式在单个图像或一批图像中矢量化。 所以我想知道如何提高它的速度以使用矢量化或使用内置方差算法。
这是更新/合并两个批次的均值和方差所需的两个函数。这两个函数都可以与向量(3 个颜色通道)一起使用,并且可以从内置方法中获取均值和方差,例如
batch.var()
.
方程式取自:https://notmatthancock.github.io/2017/03/23/simple-batch-stat-updates.html
# m amount of samples (or pixels) over all previous badges
# n amount of samples in new incoming batch
# mu1 previous mean
# mu2 mean of current batch
# v1 previous variance
# v2 variance of current batch
def combine_means(mu1, mu2, m, n):
"""
Updates old mean mu1 from m samples with mean mu2 of n samples.
Returns the mean of the m+n samples.
"""
return (m / (m+n)) * mu1 + (n/(m+n))*mu2
def combine_vars(v1, v2, mu1, mu2, m, n):
"""
Updates old variance v1 from m samples with variance v2 of n samples.
Returns the variance of the m+n samples.
"""
return (m/(m+n)) *v1 + n/(m+n) *v2 + m*n/(m+n)**2 * (mu1 - mu2)**2