python - python 对单个图像的非负矩阵分解

标签 python numpy matplotlib scikit-learn nmf

我正在尝试将 NMF 应用于以灰度模式加载的特定图像。我尝试了几个链接,但应用 NMF 后的图像几乎保持不变,无法与最初加载的灰度图像区分开。

然而,当我遇到 scikit-learn 在数据集上实现分解的代码时,我发现那里的面孔已经变成了幽灵般的面孔。这是链接:

http://scikit-learn.org/stable/auto_examples/decomposition/plot_faces_decomposition.html#sphx-glr-auto-examples-decomposition-plot-faces-decomposition-py

这是我正在使用的代码:

import cv2    
from sklearn import decomposition    
import matplotlib.pyplot as plt    

img = cv2.imread('test1.jpeg',0)    
estimator = decomposition.NMF(n_components = 2, init = 'nndsvda', tol = 5e-3)    
estimator.fit(img)    
vmax = max(img.max(), -img.min())    
plt.imshow(img, cmap=plt.cm.gray, interpolation = 'nearest',vmin=-vmax,vmax=vmax)    
plt.show()

我对矩阵上的 NMF 技术很陌生,尤其是这样一个大图像 numpy 数组。
我的图像是 test1.jpeg,即 225 * 224 .jpeg 图像。

有人可以帮我实现单个图像的代码吗? 预先非常感谢。

最佳答案

您在图中获得原始图像的原因是您实际上绘制了原始图像。相反,您需要使用估计器的输出。

NMF 分解产生两个矩阵 WH 组成原始矩阵。您需要将它们相乘才能得到图像。

import cv2    
from sklearn import decomposition    
import matplotlib.pyplot as plt 
import numpy as np   

img = cv2.imread('data/trump2.jpg',0)  
vmax = max(img.max(), -img.min())

fig, (ax, ax2)  =plt.subplots(ncols=2)    
ax.imshow(img, cmap=plt.cm.gray, interpolation = 'nearest',vmin=-vmax,vmax=vmax)

n_components = 20

estimator = decomposition.NMF(n_components = n_components, init = 'random', tol=5e-3)    
W = estimator.fit_transform(img)
H = estimator.components_

new_img = np.dot(W,H)
ax2.imshow(new_img, cmap=plt.cm.gray,
                   interpolation='nearest',
                   vmin=-vmax, vmax=vmax)

plt.show()

enter image description here

关于python - python 对单个图像的非负矩阵分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44993322/

相关文章:

python - 生成一维数组多次移位的二维数组的有效方法

python - 如何根据条件创建新列?

python - 解释 numpy.fft.fft2 输出

python - 带 GPS 数据的加权 K 均值

python - Matplotlib:绘制数据然后进行时间序列预测

python - 将索引显示为 Pandas 图的 xticks

python - 当列缺失值时预处理 Sklearn Imputer

python - Python 中的机器人运动

python - 在扭曲中并行运行长阻塞计算

python - Tkinter回调异常: matplotlib animation