In[]:=
x=ImageData[ExampleData[{"TestImage","Airplane2"}]];(*サンプルデータの読み込みと数値化*)​​Image[x](*画像の表示*)​​Dimensions[x](*データのサイズ*)
Out[]=
Out[]=
{512,512}
xx=x[[1;;512,1;;500]];(*画像データを512x500の行列に成形*)​​​​{u,s,v}=SingularValueDecomposition[xx,MatrixRank[xx]];​​(*SVD、u:左特異行列、s:特異値行列、v:右特異行列*)​​​​ListPlot[Diagonal[s],AxesLabel->{"rank","σ"},PlotRange->{{0,500},{0,25}},​​PlotLabel->"Singular Values"](*sの対角成分のプロット*)​​ac=Accumulate[Diagonal[s]]/Max[Accumulate[Diagonal[s]]]*100;(*Sの対角成分の累積*)​​ind=Nearest[ac->"Index",80];(*80%に最も近い値のインデクス*)​​Show[ListPlot[ac,AxesLabel->{"rank","Cumlative sum[%]"},PlotRange->{{0,500},{0,100}},​​PlotLabel->"Cumlative sum",PlotHighlighting->Placed["Dropline",ind]],​​ListPlot[{Flatten[{ind,ac[[ind]]}]},PlotStyle->PointSize[Large]]]​​
Out[]=
Out[]=
In[]:=
​​{u2,s2,v2}=SingularValueDecomposition[xx,UpTo[52]];​​    (*SVD、u2:左特異行列、s2:特異値行列、v2:右特異行列*)​​Dimensions[s2]​​Image[xx](*元イメージ*)​​Image[u2.s2.Transpose[v2]](*圧縮し次元削減したイメージ*)​​
Out[]=
{52,52}
Out[]=
Out[]=
In[]:=
​