沿圆形路径计算图像像素的总和

时间:2018-04-17 17:41:23

标签: python numpy mask calculus

我有一个图像,我试图沿着圆形路径计算线积分(和)。我的想法是:

  1. 计算圆形路径以求和
  2. 根据路径屏蔽图像,除了与路径重合的所有内容都将其清零。
  3. 对所有图像像素求和
  4. 我目前陷入第一步和第二步之间,我无法弄清楚如何在与图像相同的网格上生成圆圈。

    在代码中:

    from scipy.stats import multivariate_normal
    
    radius = 2
    
    # Draw arbitrary image 
    x, y = np.mgrid[-5:5:.1, -5:5:.1]
    img = multivariate_normal.pdf(np.dstack((x, y)), cov=[[1, 0.7], [0.7, 1]])
    
    # generate circle with desired radius 
    circle = radius*np.exp(1j*np.linspace(-np.pi, np.pi, 100))
    
    pyplot.pcolormesh(x, y, img)
    pyplot.plot(np.real(circle), np.imag(circle), '-w')
    pyplot.show()
    

    给出了: enter image description here

    问题:

    如何使用圆圈遮盖与此圆圈重合的图像像素?

1 个答案:

答案 0 :(得分:1)

这是计算积分的另一种方法:它使用插值使图像成为矩形上定义的函数,然后使用标准积分求解器计算路径积分。

from scipy.integrate import quad
from scipy.interpolate import RectBivariateSpline
from scipy.stats import multivariate_normal
import numpy as np

x, y = np.ogrid[-5:5:.1, -5:5:.1]
img = multivariate_normal.pdf(np.dstack(np.broadcast_arrays(x, y)),
                              cov=[[1, 0.7], [0.7, 1]])

f = RectBivariateSpline(x.ravel(), y.ravel(), img)

radius, centerx, centery = 3.0, 1.0, -1.5
def integrand(rad):
    return f(centerx+radius*np.cos(rad), centery+radius*np.sin(rad))

def true_integrand(rad):
    return multivariate_normal(cov=[[1, 0.7], [0.7, 1]]).pdf(
        (centerx+radius*np.cos(rad), centery+radius*np.sin(rad)))

print(quad(integrand, -np.pi, np.pi))
print(quad(true_integrand, -np.pi, np.pi))

输出:

(0.07985467350026378, 1.3411796499850778e-08)
(0.07985453947958436, 4.006916325573184e-11)