壓縮傳感(Compressed sensing)”是數學和應用演算法研究熱門領域,這項研究利用數學中的稀疏概念,從雜訊中重建圖像或其它資料集。 壓縮傳感的發現是一次意外,當時是加州理工學院教授(現在去了斯坦福)的Emmanuel Candès在研究名叫Shepp-Logan Phantom的 圖像,這種標準圖像常被電腦科學家和工程師測試圖像演算法。Candès檢查的圖像品質非常差,充滿了雜訊,他認為名叫L1-minimization的 數學演算法能去除掉雜訊條紋,結果他按一個鍵後演算法真的起作用了。但在圖像變乾淨的同時,他發現圖像的細節出人意料的完美起來。他隨後向當時在UCLA的同 事陶哲軒展示了這一奇跡。第二天晚上,陶哲軒就完成了一組扎記,它們成為兩人合作的壓縮傳感領域第一篇論文的 基礎 (http://arxiv.org/abs/math.CA/0410542)。Emmanuel Candès認為壓縮傳感(簡寫CS)技術具有廣闊的應用前景,比如MRI,數碼相機。數碼相機鏡頭收集了大量的資料,然後再壓縮,壓縮時丟棄掉90%的 資料。如果有CS,如果你的照相機收集了如此多的資料只是為了隨後的刪除,那麼為什麼不一開始就丟棄那90%的資料,直接去除冗餘資訊不僅可以節省電池電 量,還能節省空間。
clc;clear
load DCTq; %讀量化表格
% Read the input image;
xtatal = double(imread('lena512.bmp')); %讀圖檔 目前應該是黑白
figure(1);
imshow(uint8(xtatal)); %秀出原始圖檔
for j=0:size(xtatal,1)/8-1 %每格高8像素 總共 (高/8) 格 需整除
x0 = xtatal(1+i*8:8+i*8,1+j*8:8+j*8); %一個block 處理
f = f(:); %拉成一維 (n*1)
n= size(x0,1)*size(x0,1); %總點數 n
s=length(find(floor((dct2(x0)+floor(Q/2))./Q)~=0)); %不等於0的有s個
M=32; %設定M大小 每個block 都用一樣
A = get_A_random(n,M); %sensing matrix (M*n)
Psi=dctmtx(n); %DCT基底 (n*n)
y = A*Psi*f; %measurment (壓縮後大小 y(M*1)) (編碼)
%用(l1 magic)tool 求l1 最佳稀疏解 (解碼)
%用CVX tool 求l1 最佳稀疏解 (解碼)
cvx_begin
variable xp(n);
minimize (norm( xp , 1 ) ) ;
subject to
A*Psi*xp == y ;
cvx_end
%norm(f-xp)/norm(f); %計算誤差??
hat_x=reshape(round(xp),8,8); %(n*1)一維轉換成8*8
xhatall(1+i*8:8+i*8,1+j*8:8+j*8)=(idct2(floor(hat_x.*Q))); %反量化&反DCT 還原圖檔
%調整超過的像素值
[r1,c1]=(find(xhatall>255));
for l=1:length(r1)
xhatall(r1(l),c1(l))=255;
end
[r2,c2]=(find(xhatall<0));
for l=1:length(r2)
xhatall(r2(l),c2(l))=0;
end
%不確定對不對的方式
end
figure(2);
imshow(uint8(xhatall)); %秀出還原的圖檔
Compressive Sensing (matlab code using DCT)
load DCTq; %讀量化表格
% Read the input image;
xtatal = double(imread('lena512.bmp')); %讀圖檔 目前應該是黑白
figure(1);
imshow(uint8(xtatal)); %秀出原始圖檔
% keep an original copy of the input signal
for i=0:size(xtatal,1)/8-1 %每格寬8像素 總共 (寬/8) 格 需整除for j=0:size(xtatal,1)/8-1 %每格高8像素 總共 (高/8) 格 需整除
x0 = xtatal(1+i*8:8+i*8,1+j*8:8+j*8); %一個block 處理
% xmean = mean(x0(:));
% x0=x0-xmean;
% figure(1);
% imshow(uint8(x0));
f=floor((dct2(x0)+floor(Q/2))./Q); %一個block作DCT和量化後的 係數(稀疏)f = f(:); %拉成一維 (n*1)
n= size(x0,1)*size(x0,1); %總點數 n
s=length(find(floor((dct2(x0)+floor(Q/2))./Q)~=0)); %不等於0的有s個
M=32; %設定M大小 每個block 都用一樣
% M=s*log(n/s)+1; %需大於s*log(n/s) 公式?
% if (M<32) %補不足的點(自己設定的)
% M=32;
% end
A = get_A_random(n,M); %sensing matrix (M*n)
Psi=dctmtx(n); %DCT基底 (n*n)
y = A*Psi*f; %measurment (壓縮後大小 y(M*1)) (編碼)
%用(l1 magic)tool 求l1 最佳稀疏解 (解碼)
% % S o l v e u s ing l 1 magic .
% path(path ,'./Optimization') ;
% xinit = pinv(A)*y; % i n i t i a l g u e s s = min ene r g y
% tic
% xp = l1eq_pd ( xinit , A, [ ] , y , 1e-3);
% toc
%用CVX tool 求l1 最佳稀疏解 (解碼)
cvx_begin
variable xp(n);
minimize (norm( xp , 1 ) ) ;
subject to
A*Psi*xp == y ;
cvx_end
%norm(f-xp)/norm(f); %計算誤差??
hat_x=reshape(round(xp),8,8); %(n*1)一維轉換成8*8
xhatall(1+i*8:8+i*8,1+j*8:8+j*8)=(idct2(floor(hat_x.*Q))); %反量化&反DCT 還原圖檔
%調整超過的像素值
[r1,c1]=(find(xhatall>255));
for l=1:length(r1)
xhatall(r1(l),c1(l))=255;
end
[r2,c2]=(find(xhatall<0));
for l=1:length(r2)
xhatall(r2(l),c2(l))=0;
end
%不確定對不對的方式
% xhatall(1+i*8:8+i*8,1+j*8:8+j*8)=reshape(Psi*reshape(hat_x.*Q,64,1),8,8);
endend
figure(2);
imshow(uint8(xhatall)); %秀出還原的圖檔
沒有留言:
張貼留言