【发布时间】:2013-11-26 21:32:19
【问题描述】:
我有一个 numpy 数组形式的大图像(opencv 将它作为 3 个 uint8 值的二维数组返回)并且想要计算每个像素的高斯内核的总和,即(SO 中仍然没有 LaTeX 支持吗? ):
对于具有指定权重 w、均值和对角协方差矩阵的 N 个不同内核。
所以基本上我想要一个函数compute_densities(image, kernels) -> numpy array of floats。在 python 中有效地做到这一点的最佳方法是什么?如果 scipy 中还没有为此的库函数,我会感到惊讶,但我很久以前在 uni 有统计数据,所以我对文档的细节有点困惑..
基本上我想要以下,只是比天真的 python (2pi^{-3/2} 被忽略,因为它是一个常数因素,对我来说并不重要,因为我只对概率之间的比率感兴趣)
def compute_probabilities(img, kernels):
np.seterr(divide='ignore') # 1 / covariance logs an error otherwise
result = np.zeros((img.shape[0], img.shape[1]))
for row_pos, row_val in enumerate(img):
for col_pos, val in enumerate(row_val):
prob = 0.0
for kernel in kernels:
mean, covariance, weight = kernel
val_sub_mu = np.array([val]).T - mean
cov_inv = np.where(covariance != 0, 1 / covariance, 0)
tmp = val_sub_mu.T.dot(cov_inv).dot(val_sub_mu)
prob += weight / np.sqrt(np.linalg.norm(covariance)) * \
math.exp(-0.5 * tmp)
result[row_pos][col_pos] = prob
np.seterr(divide='warn')
return result
输入:cv2.imread 在一些 jpg 上,它给出了一个包含 3 个颜色通道的 3 uint8 结构的二维数组(高 x 宽)。
内核是一个namedtuple('Kernel', 'mean covariance weight'),平均值是一个向量,协方差是一个3x3 矩阵,除了对角线为零,权重是一个浮点数0 < weight < 1。为简单起见,我只指定对角线,然后将其转换为 3x3 矩阵:(表示不是一成不变的,我不在乎它是如何表示的,所以可以随意更改所有这些):
some_kernels = [
Kernel(np.array([(73.53, 29.94, 17.76)]), np.array([(765.40, 121.44, 112.80)]), 0.0294),
...
]
def fixup_kernels(kernels):
new_kernels = []
for kernel in kernels:
cov = np.zeros((3, 3))
for pos, c in enumerate(kernel.covariance[0]):
cov[pos][pos] = c
new_kernels.append(Kernel(kernel.mean.T, cov, kernel.weight))
return new_kernels
some_kernels = fixup_kernels(some_kernels)
img = cv2.imread("something.jpg")
result = compute_probabalities(img, some_kernels)
【问题讨论】:
-
查看 scipy.ndimage (docs.scipy.org/doc/scipy/reference/ndimage.html)。构建内核,然后使用 convolve 方法将它们与数组进行卷积。
-
添加了一个赏金,希望有人想提供一个示例,说明我将如何使用 convolve 和 co 来实现该功能。
-
Voo,您能否在您的示例中添加一些示例值和对 compute_probabilities() 的示例调用? (以及它产生的结果)我会尝试这样做,但输入的类型并不完全清楚。我认为协方差是一个 KxK 数组,其中 K 是 img.shape[2],对吗?
-
@Alex 我们开始了,希望它更清楚
-
@Voo,请看下面的答案,我认为它有效。
标签: python opencv optimization numpy scipy