【问题标题】:Non negative matrix factorisation in python on individual imagespython中对单个图像的非负矩阵分解
【发布时间】:2017-12-13 01:59:10
【问题描述】:

我正在尝试将 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 图像。

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

【问题讨论】:

    标签: python numpy matplotlib scikit-learn nmf


    【解决方案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()
    

    【讨论】:

    • 非常感谢您的帮助,先生!
    猜你喜欢
    • 1970-01-01
    • 2014-09-04
    • 2015-10-06
    • 2017-04-07
    • 2012-05-02
    • 2013-05-10
    • 2017-09-06
    • 1970-01-01
    • 2015-10-11
    相关资源
    最近更新 更多