低秩矩陣的應用--背景建模
背景建模是從拍攝的視訊中分離出背景和前景。
由於背景的視訊基本是不變的,所以如果把每幀當做一個矩陣的一列那麼,矩陣是低秩的,所以低秩矩陣的恢復來恢復出背景。
今天主要完成了,在自己的資料庫讓進行背景和前景的分離。下面為主要步驟:
1.從馬毅的實驗室網址下載RPCA求解的程式碼http://perception.csl.illinois.edu/matrix-rank/introduction.html
2.給出的介面是[A_hat E_hat iter] = inexact_alm_rpca(D, lambda, tol, maxIter)
所以明確目標:D是我們的視訊中的每一幀,A_hat 是我們估計的背景,E_hat是前景。
RPCA解決的問題是
clc; clear; %% this to read avi by using mmread to get every frame video = VideoReader('E:\FFOutput\test.avi'); nFrames = video.NumberOfFrames; %得到幀數 H = video.Height; %得到高度 W = video.Width; %得到寬度 Rate = video.FrameRate; Cal_FrameN=300; % Preallocate movie structure. mov(1:Cal_FrameN) = struct('cdata',zeros(H,W,3,'uint8'),'colormap',[]); %read one frame every time for i = 1:Cal_FrameN mov(i).cdata = read(video,i); P = mov(i).cdata; double_P=im2double(P); %imshow( double_P),title('原始圖片3'); Frame=rgb2gray( double_P);%當前灰度幀 %下采樣 Down_Frame=Frame(2:4:H,2:4:W); M(:, i) = Down_Frame(:); % disp('當前播幀數:'),disp(i); % imshow(P),title('原始圖片'); % P2=rgb2gray(P); end [A_hat, E_hat, iter]=inexact_alm_rpca(M,0.006); A=reshape(A_hat(:,200), size(Down_Frame)); E=reshape(E_hat(:,200), size(Down_Frame)); D_real=reshape(M(:,200), size(Down_Frame)); figure; imshow(D_real),title('原始圖片'); figure; imshow(A),title('恢復圖片'); figure; imshow(abs(E)),title('錯誤圖片');
因為是MATLAB的初學者所以遇到了兩個問題:
A.必須對讀取的影象做double_P=im2double(P);處理不然會出現
錯誤使用 *
MTIMES 不完全支援整數類。至少有一個輸入必須為標量。
要按元素進行 TIMES 計算,請改用 TIMES (.*)。
出錯 lanbpro (line 298)
r = At*U(:,1);
出錯 lansvd (line 209)
[U,B,V,p,ierr,w] = lanbpro(A,j,p,options,U,B,V,anorm);
出錯 inexact_alm_rpca (line 53)
norm_two = lansvd(Y, 1, 'L');
出錯 background (line 36)
[A_hat, E_hat, iter]=inexact_alm_rpca(M,0.006);
B在顯示錯誤圖片時需要做abs絕對值處理,不然是全黑的圖片,不能看到前景影象。
C.最後一個也非常重要lumada值為1/(根號m).m為一張圖片畫素點的個數
D還有一個問題就是原圖片很到,直接做會有記憶體不夠的問題,所以進行了下采樣。
實驗結果:
=+