matlab非负矩阵分解(添加彩色图片灰度化)
先上代码吧~引用了别人的https://www.cnblogs.com/tiandsp/archive/2012/11/13/2768597.html
clear all;
close all;
clc; %清空命令行窗口
pic = imread('1.jpg'); %imread读取灰度或者彩色图像
[d1,d2,d3] = size(pic);
if d3 > 2 %判断是否是彩色图片
gray_pic = rgb2gray(pic); %将彩色图片灰度化
else
gray_pic = pic;
end
V=double(gray_pic);
imshow(mat2gray(V)); %mat2gray将矩阵v归一化,每个值在0,1
[i,u]=size(V); %计算V的规格,i行 u列
r=100; %设置分解矩阵的秩
W=rand(i,r); %初始化W,H,为非负数
H=rand(r,u);
maviter=500; %最大迭代次数,越大越越接近原图
for iter=1:maviter
W=W.*((V./(W*H))*H');
W=W./(ones(i,1)*sum(W)); %ones(i,1)产生一个i行1列的矩阵
H=H.*(W'*(V./(W*H)));
end
img_V=W*H;
figure;
imshow(mat2gray(img_V));
因为第一次接触matlab,所以注释写得很详细。代码引用了很多大佬的,然后自己添加了判断彩色图片,然后将彩色图片灰度化的部分。
说说自己遇到的几个问题:
(1)因为第一次接触matlab和非负矩阵分解,很多细节不知道,虽然用了大佬的代码,但是我把图片换了,是彩色的,再运行代码就跑不起来了。冥思苦想,各种百度,最后才知道彩色图片是三维的,然而非负矩阵分解是二维的,知道自己错在哪了,那接下来就是开始改正,开始做彩色图片灰度化。
(2)在灰度化中,我第一次尝试时,文件名保存为gray.m,然后报错了,下面放图:
遇到这种情况,就改文件名就好了 哈哈哈哈哈哈
效果图:
好的,这次就记录这些吧,好好看论文了。