我正在尝试生成一个热图,其中像素值由两个独立的2D高斯分布控制。让它们分别是Kernel1(muX1,muY1,sigmaX1,sigmaY1)和Kernel2(muX2,muY2,sigmaX2,sigmaY2)。更具体地说,每个核的长度是其标准差的三倍。第一个内核的sigmaX1=sigmaY1,第二个内核的sigmaX2<;sigmaY2。两个核的协方差矩阵都是对角的(X和Y是独立的)。Kernel1通常完全在Kernel2内部。在
我尝试了以下两种方法,结果都不令人满意。有人能给我一些建议吗?在
方法1:
迭代地图上的所有像素值对(i,j),计算i(i,j)=p(i,j | Kernel1,Kernel2)=1-(1-p(i,j | Kernel1))*(1-p(i,j | Kernel2))给出的i(i,j)的值。然后我得到了下面的结果,在平滑度方面是好的。但是在我的电脑上运行需要10秒,这太慢了。在
代码:
def genDensityBox(self, height, width, muY1, muX1, muY2, muX2, sigmaK1, sigmaY2, sigmaX2):
densityBox = np.zeros((height, width))
for y in range(height):
for x in range(width):
densityBox[y, x] += 1. - (1. - multivariateNormal(y, x, muY1, muX1, sigmaK1, sigmaK1)) * (1. - multivariateNormal(y, x, muY2, muX2, sigmaY2, sigmaX2))
return densityBox
def multivariateNormal(y, x, muY, muX, sigmaY, sigmaX):
return norm.pdf(y, loc=muY, scale=sigmaY) * norm.pdf(x, loc=muX, scale=sigmaX)
方法2:
分别生成对应于两个核的两个图像,然后使用特定的alpha值将它们混合在一起。每幅图像由两个一维高斯滤波器的外积生成。然后我得到了下面的结果,这是非常粗糙的。但是这种方法的优点是由于使用了两个向量之间的外积,所以速度非常快。
由于第一种方法比较慢,第二种方法比较粗糙,所以我试图找到一种新的方法,既能获得良好的平滑度,又能降低时间复杂度。有人能帮我吗?在
谢谢!在
对于第二种方法,2D高斯映射可以很容易地生成,如所述here:
^{pr2}$
您的方法很好,除了不应该在
norm.pdf
上循环之外,只需推送所有需要计算内核的值,然后将输出重塑为所需的图像形状。在这种方法不会花费太长时间:
^{pr2}$相关问题 更多 >
编程相关推荐