我正在做一个需要得到图像方差的项目。 目前我正在采取两种方法(两种方法都有效,但速度很慢):
这是使用numpy的代码,varianceMatrix是输出
varianceMatrix = np.zeros(im.shape,np.uint8)
w = 1 # the radius of pixels neighbors
ny = len(im)
nx = len(im[0])
for i in range(w,nx-w):
for j in range(w,ny-w):
sampleframe = im[j-w:j+w, i-w:i+w]
variance = np.var(sampleframe)
varianceMatrix[j][i] = int(variance)
return varianceMatrix
这是scipy函数:
^{pr2}$scipy函数速度更快,但不太快。我在找一个更好的方法来计算方差。在
有什么想法吗???在
这里有一个使用OpenCV的快速解决方案:
在我的机器上,对于下面的例子,
^{pr2}$winVar()
比ndimage.generic_filter()
快2915倍,比sliding_img_var()
快10.8倍(见pv的答案):结果与
ndimage.generic_filter()
的匹配:您可以使用著名的sliding window stride trick来加快计算速度。它在不复制数据的情况下将两个“虚拟维度”添加到数组的末尾,然后计算它们之间的方差。在
注意,在您的代码中,
im[j-w:j+w, ..]
覆盖了索引j-w,j-w+1,...,j+w-1
,最后一个是排他的,这可能不是您的意思。另外,方差大于uint8的范围,因此最终得到整数环绕。在如果使用
ndimage.generic_filter
的方法不够快,您可以为Cython中的方差计算编写自己的优化实现。在相关问题 更多 >
编程相关推荐