matlab非负矩阵实现图片降维
来源:互联网 发布:肯尼迪v5数据 编辑:程序博客网 时间:2024/05/29 02:41
最近在看非负数矩阵,参考了一位博主的文章。非负矩阵的大意是将一个矩阵拆分成为两个较小矩阵。
例如: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)));endimg_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
阅读全文