2024-05-21 05:15:24 发布
网友
我正在尝试将二维高斯拟合到图像中。噪音很低,所以我试图旋转图像,使两个主轴不发生共变,计算出最大值,然后计算出两个维度的标准差。选择的武器是Python。
然而,我一直在寻找图像的特征向量-numpy.linalg.py假设数据点是离散的。我想把这张图像作为概率分布,采样几千个点,然后从分布中计算特征向量,但我相信一定有办法直接从图像中找到特征向量(即高斯椭圆的半长轴和半短轴)。有什么想法吗?
numpy.linalg.py
非常感谢:)
稳健地拟合高斯分布是很困难的。在IEEE信号处理杂志上有一篇关于这个话题的有趣文章:
Hongwei Guo, "A Simple Algorithm for Fitting a Gaussian Function" IEEE Signal Processing Magazine, September 2011, pp. 134--137
我在这里给出1D案例的一个实现:
http://scipy-central.org/item/28/2/fitting-a-gaussian-to-noisy-data-points
(向下滚动以查看得到的配合)
简单地说,有几种工具可以将高斯拟合到图像中。我唯一能想到的是scikits.learn,它不是完全面向图像的,但我知道还有其他的。
精确地计算协方差矩阵的特征向量在计算上是非常昂贵的。你必须将图像的每个像素(或一个大的浅随机样本)与一个x,y点相关联。
基本上,你会做如下事情:
import numpy as np # grid is your image data, here... grid = np.random.random((10,10)) nrows, ncols = grid.shape i,j = np.mgrid[:nrows, :ncols] coords = np.vstack((i.reshape(-1), j.reshape(-1), grid.reshape(-1))).T cov = np.cov(coords) eigvals, eigvecs = np.linalg.eigh(cov)
取而代之的是,你可以利用它是一个有规律的采样图像,并计算它的矩(或“内部轴”)。对于大型图像,这将大大加快速度。
作为一个简单的例子,(我正在使用我的previous answers的一部分,以防您发现它很有用…)
import numpy as np import matplotlib.pyplot as plt def main(): data = generate_data() xbar, ybar, cov = intertial_axis(data) fig, ax = plt.subplots() ax.imshow(data) plot_bars(xbar, ybar, cov, ax) plt.show() def generate_data(): data = np.zeros((200, 200), dtype=np.float) cov = np.array([[200, 100], [100, 200]]) ij = np.random.multivariate_normal((100,100), cov, int(1e5)) for i,j in ij: data[int(i), int(j)] += 1 return data def raw_moment(data, iord, jord): nrows, ncols = data.shape y, x = np.mgrid[:nrows, :ncols] data = data * x**iord * y**jord return data.sum() def intertial_axis(data): """Calculate the x-mean, y-mean, and cov matrix of an image.""" data_sum = data.sum() m10 = raw_moment(data, 1, 0) m01 = raw_moment(data, 0, 1) x_bar = m10 / data_sum y_bar = m01 / data_sum u11 = (raw_moment(data, 1, 1) - x_bar * m01) / data_sum u20 = (raw_moment(data, 2, 0) - x_bar * m10) / data_sum u02 = (raw_moment(data, 0, 2) - y_bar * m01) / data_sum cov = np.array([[u20, u11], [u11, u02]]) return x_bar, y_bar, cov def plot_bars(x_bar, y_bar, cov, ax): """Plot bars with a length of 2 stddev along the principal axes.""" def make_lines(eigvals, eigvecs, mean, i): """Make lines a length of 2 stddev.""" std = np.sqrt(eigvals[i]) vec = 2 * std * eigvecs[:,i] / np.hypot(*eigvecs[:,i]) x, y = np.vstack((mean-vec, mean, mean+vec)).T return x, y mean = np.array([x_bar, y_bar]) eigvals, eigvecs = np.linalg.eigh(cov) ax.plot(*make_lines(eigvals, eigvecs, mean, 0), marker='o', color='white') ax.plot(*make_lines(eigvals, eigvecs, mean, -1), marker='o', color='red') ax.axis('image') if __name__ == '__main__': main()
你试过主成分分析吗?或许MDP package可以用最少的努力完成这项工作。
稳健地拟合高斯分布是很困难的。在IEEE信号处理杂志上有一篇关于这个话题的有趣文章:
我在这里给出1D案例的一个实现:
http://scipy-central.org/item/28/2/fitting-a-gaussian-to-noisy-data-points
(向下滚动以查看得到的配合)
简单地说,有几种工具可以将高斯拟合到图像中。我唯一能想到的是scikits.learn,它不是完全面向图像的,但我知道还有其他的。
精确地计算协方差矩阵的特征向量在计算上是非常昂贵的。你必须将图像的每个像素(或一个大的浅随机样本)与一个x,y点相关联。
基本上,你会做如下事情:
取而代之的是,你可以利用它是一个有规律的采样图像,并计算它的矩(或“内部轴”)。对于大型图像,这将大大加快速度。
作为一个简单的例子,(我正在使用我的previous answers的一部分,以防您发现它很有用…)
你试过主成分分析吗?或许MDP package可以用最少的努力完成这项工作。
相关问题 更多 >
编程相关推荐