(* przetwarzanie jpg na macierz *)
zdjecieorg=Import["zdjecie5.jpg"];
zdjecieorg=ColorConvert[zdjecieorg,"Grayscale"];
zdjecie=ImageData[zdjecieorg];
If[Length[zdjecie]>400,zdjecieorg=ImageResize[zdjecieorg,400];
zdjecie=ImageData[zdjecieorg]];
dh=Length[zdjecie];
dv=Length[zdjecie[[1]]];
dl=Min[{dh,dv}]
th=Max[{Round[(dh-dl)/2],0}];
tv=Max[{Round[(dv-dl)/2],0}];
wybierz[A_,m_,n_,d_]:=Table[Take[A[[i]],{n+1,n+d}],{i,m+1,m+d}];
tab=wybierz[zdjecie,th,tv,dl];

(* probka danych *)
MatrixForm[Table[tab[[i,j]],{i,1,10},{j,1,10}]]

(* Rozkladanie macierzy tab=u.w.Transpose[v], gdzie u i v sa ortogonalne, w diagonalna *)
{u,w,v}=SingularValueDecomposition[tab];
Image[u.w.Transpose[v]]

(* Kilka pierwszych wyrazow z diagonali *)
Table[w[[i,i]],{i,1,50}]
diagonala=Table[{i,w[[i,i]]},{i,1,dl}];
Show[ListPlot[diagonala],PlotRange->All,AspectRatio->0.3]

(* tworzenie z macierzy z pierwszych d wyrazow *) 
lewa[d_]:=Table[Take[u[[i]],{1,d}],{i,1,dl}]
prawa[d_]:=Table[Take[v[[i]],{1,d}],{i,1,dl}]
srodek[d_]:=Table[w[[i,j]],{i,1,d},{j,1,d}]
kompresja[s_]:=(d=Min[Max[1,Round[dl s]],dl];Print[d," wartosci z przekatnej sposrod ", dl];
lewa[d].srodek[d].Transpose[prawa[d]])

(* sklejanie obrazow *)
porownanie[s_]:=Image[Transpose[Join[Transpose[kompresja[s]],Transpose[tab]]]]

porownanie[0.5]

porownanie[0.1]

porownanie[0.05]

porownanie[0.02]

porownanie[0.01]

porownanie[0.005]

porownanie[0.002]