python如何提取图片特征向量_在python中计算图像的特征向量
我正在嘗試將二維高斯擬合到圖像中。噪聲很低,所以我試圖旋轉(zhuǎn)圖像,使兩個主軸不同時變化,算出最大值,然后計算兩個維度的標(biāo)準(zhǔn)偏差。選擇的武器是Python。
。
然而,我一直在尋找圖像的特征向量——numpy.linalg.py假設(shè)離散的數(shù)據(jù)點。我想把這幅圖像作為概率分布,取樣幾千點,然后根據(jù)這個分布計算特征向量,但我確信一定有一種方法可以直接從這幅圖像中找到特征向量(即高斯橢圓的半長軸和半長軸)。有什么想法嗎?
非常感謝:)
只是一個簡短的說明,有幾個工具來適應(yīng)高斯圖像。我唯一能想到的就是Scikits.Learn,它不是完全面向圖像的,但我知道還有其他的。
準(zhǔn)確地計算協(xié)方差矩陣的特征向量是非常昂貴的。您必須將圖像的每個像素(或大的ISH隨機采樣)與X、Y點相關(guān)聯(lián)。
基本上,你會做如下的事情:
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)
相反,您可以利用它是一個定期采樣的圖像的事實,并計算它的時刻(或"國際軸")。對于大圖像來說,這會快得多。
作為一個簡單的例子,(我使用了我以前的一個答案的一部分,以防你發(fā)現(xiàn)它有用…)
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()
號
。
強大地擬合高斯可能很困難。在IEEE信號處理雜志上有一篇關(guān)于這個主題的有趣文章:
Hongwei Guo,"A Simple Algorithm for Fitting a Gaussian Function" IEEE
Signal Processing Magazine, September 2011, pp. 134--137
號
我在這里給出1d案例的實現(xiàn):
http://scipy-central.org/item/28/2/fitting-a-gaussian-to-noise-data-points網(wǎng)站
(向下滾動查看結(jié)果匹配)
你嘗試過主成分分析(PCA)嗎?也許MDP包可以用最少的努力完成這項工作。
總結(jié)
以上是生活随笔為你收集整理的python如何提取图片特征向量_在python中计算图像的特征向量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北大教授:到底什么才是有效的教育?
- 下一篇: 删文97篇!前UCLA教授竟是民科?不看