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

python中单个图像的非负矩阵分解,python,numpy,matplotlib,scikit-learn,nmf,Python,Numpy,Matplotlib,Scikit Learn,Nmf,我试图将NMF应用于以灰度模式加载的特定图像。我尝试了几个链接,但我的图像在应用NMF后几乎保持不变,无法与最初加载的灰度图像区分开来 然而,当我遇到scikit learn关于在数据集上实现分解的代码时,我看到那里的面已经被转换成了幽灵般的面。以下是链接: 下面是我正在使用的代码: import cv2 from sklearn import decomposition import matplotlib.pyplot as plt img = cv2.imread

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

然而,当我遇到scikit learn关于在数据集上实现分解的代码时,我看到那里的面已经被转换成了幽灵般的面。以下是链接:

下面是我正在使用的代码:

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分解产生构成原始矩阵的两个矩阵
W
H
。你需要把它们相乘才能得到图像

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()

非常感谢您的帮助,先生!