\begin{Tehtava}
\begin{tehtava}
Tässä tehtävässä tutkitaan kuvien, matriisien ja singulaariarvojen yhteyksiä. 

Matriisin $\mathbf{A} \in \R^{m\times n}$ singulaariarvohajotelma on 
\[
\mathbf{A} =\mathbf{U}\mathbf{S}\mathbf{V}^T, 
\]  
missä matriisi $\mathbf{S}$ on diagonaalimatriisi, ja matriisit $\mathbf{U}$ ja $\mathbf{V}$ ovat ortogonaalisia neliömatriiseja. Matriisin sisältämää informaatiota voidaan tietyssä mielessä kompressoida tiputtamalla osia singulaariarvohajotelmasta pois; on todistettavissa että (MATLABilla ilmaistuna) \texttt{U(:,1:k)*S(1:k,1:k)*V(:,1:k)'} on paras mahdollinen $\mathrm{rank}(k)$-approksimaatio matriisille $\mathbf{A}$. 

Kuva voidaan ajatella $m \times n$ matriisina, missä  $i,j$ alkio ilmaisee vastaavassa paikassa olevan pikselin väriarvon. Tutkitaan sitten kuinka singulaariarvoja voidaan käyttää hyväksi kuvien pakkaamisessa ja hahmontunnistuksessa. 

Lue haluamasi kuva sisään MATLABin \texttt{imread} komennolla. Komento luo (yleensä, mutta hieman kuvasta riippuen), $m \times n \times 3$ matriisin. Tämä vastaa RGB-esitystä: ensimmäisessä kerroksessa on punaisen värin intensiteetit, toisessa vihreän ja kolmannessa sinisen. Muuta tämä matriisi harmaaskaalaan komennolla \texttt{rgb2gray}. Tämän jälkeen tee matriisille singulaariarvohajotelma komennolla \texttt{ [u s v] = svd(P)}, missä \texttt{P} on kuvasi matriisiesitys. Tutki sitten millä $k$:n arvolla komentojono
\begin{verbatim}
>> M = u(:,1:k)*s(1:k,1:k)*v(:,1:k)';
>> image(M)
\end{verbatim}
tuottaa havaittavia tuloksia. Pitäisi myös päteä, että kuvan isommat hahmot alkavat erottua ensin, mikä tekee singulaariarvoista huomattavan tehokkaan työkalun hahmontunnistuksessa. 
\end{tehtava}
\begin{vihje}
Kuvan ulottuvuuksien ei kannata olla kovin isoja: singulaariarvohajotelma on raskas laskettava. Jos haluat lisähaastetta, erottele kuvan värikerrokset, tee hajotelma niille erikseen, ja kokoa tulokset. Näin saat aikaan värikuvia. 
\end{vihje}
\end{Tehtava}
