matlab非负矩阵实现图片降维

xiaoxiao2021-02-28  28

最近在看非负数矩阵,参考了一位博主的文章。非负矩阵的大意是将一个矩阵拆分成为两个较小矩阵。

例如:n*n矩阵,可以分解为n*1的列向量乘以1*n的行向量矩阵。

其原理如下,首先构建两个随机矩阵,然后通过递归的形式,每迭代一次,结果向原矩阵靠近一次。

原博客中matlab代码如下:

clear all; close all; clc; V=double(imread('lena.jpg')); imshow(mat2gray(V)); [i u]=size(V); %计算V的规格 r=100; %设置分解矩阵的秩 W=rand(i,r); %初始化WH,为非负数 H=rand(r,u); maviter=100; %最大迭代次数 for iter=1:maviter W=W.*((V./(W*H))*H'); %注意这里的三个公式和文中的是对应的 W=W./(ones(i,1)*sum(W)); H=H.*(W'*(V./(W*H))); end img_V=W*H; figure; imshow(mat2gray(img_V));

经过实际运行发现,该代码只适合处理二维矩阵,如果直接处理三维矩阵,会报错。有兴趣的同学可以自己考虑下,用reshape语句将三维图像降成二维再使用非负矩阵降维处理。

运行结果(左边为原图,右边为非负矩阵压缩过图片):

1.迭代50次

2.迭代100次

3、迭代500次

4、迭代1000次

非负矩阵优势是降维,劣势是迭代次数越多,越精确,但是随着迭代次数的增加,500次左右能够逼近原图,但是1000次和500次之间区别不大。

最后有个问题:如果知道多次次迭代能最接近原图呢?

参考文献: https://www.cnblogs.com/tiandsp/archive/2012/11/13/2768597.html

转载请注明原文地址: https://www.6miu.com/read-250159.html

最新回复(0)