Я хочу вычислить многомерный гауссиан для многоканального изображения. Для этой цели мне нужно рассматривать каждый пиксель с его значением в разных диапазонах как вектор, чтобы применить гауссиан, который содержит матричное умножение V^T*inv(ковариация)*V.
import numpy as np
import numpy.linalg as lg
X,Y=np.meshgrid(np.arange(-10,11,1/10),np.arange(-10,11,1/10),indexing='xy')
Z=np.stack((X,Y))
cov=np.array([[10,-0.4],[-0.4,1]])
W=lg.inv(cov)
def ee(x):
global W
x=x.reshape((-1,1))
return lg.matmul(lg.matmul(x.transpose(),W),x)[0,0]
tt=np.apply_along_axis(ee,0,Z)
p=np.exp(-0.5*tt)/(np.power(2*np.pi,cov.shape[0]/2)*np.power(lg.det(cov),0.5))
import matplotlib.pyplot as plt
plt.imshow(p)
введите здесь описание изображения
Я нашел решение apply_along_axis, но размер моего изображения (3,1000,1000), а apply_along_axis работает очень медленно примените функцию к пикселям, чтобы найти вероятность каждого пикселя. Как я могу ускорить его для реальных приложений. Спасибо
Я хочу вычислить многомерный гауссиан для многоканального изображения. Для этой цели мне нужно рассматривать каждый пиксель с его значением в разных диапазонах как вектор, чтобы применить гауссиан, который содержит матричное умножение V^T*inv(ковариация)*V. [code]import numpy as np import numpy.linalg as lg X,Y=np.meshgrid(np.arange(-10,11,1/10),np.arange(-10,11,1/10),indexing='xy') Z=np.stack((X,Y)) cov=np.array([[10,-0.4],[-0.4,1]]) W=lg.inv(cov) def ee(x): global W x=x.reshape((-1,1))
return lg.matmul(lg.matmul(x.transpose(),W),x)[0,0] tt=np.apply_along_axis(ee,0,Z) p=np.exp(-0.5*tt)/(np.power(2*np.pi,cov.shape[0]/2)*np.power(lg.det(cov),0.5)) import matplotlib.pyplot as plt plt.imshow(p)
[/code] введите здесь описание изображения Я нашел решение apply_along_axis, но размер моего изображения (3,1000,1000), а apply_along_axis работает очень медленно примените функцию к пикселям, чтобы найти вероятность каждого пикселя. Как я могу ускорить его для реальных приложений. Спасибо