2017-07-09 65 views
1

我想將NMF應用於以灰度模式加載的特定圖像。我嘗試了幾個鏈接,但是在應用NMF後我的圖像仍然幾乎相同,無法與最初加載的灰度圖像區分開來。python在單個圖像中的非負矩陣因式分解

但是,當我遇到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對矩陣技術espicially這樣一個大的圖像numpy的陣列。
我的圖像是test1.jpeg,它是225 * 224 .jpeg圖像。

有人可以幫助我實現單個圖像的代碼嗎? 非常感謝。

回答

1

您在原圖中獲得原始圖像的原因是您實際繪製了原始圖像。相反,您需要使用estimator的輸出。

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

+0

非常感謝你的幫助,先生! –