Diskretna kosinusna transformacija in kompresija slik

Kot primer bomo vzeli sliko in jo predstavili kot matriko velikosti 200x200.

slika=256-Import["ExampleData/Ocelot.jpg","Data"]

Dimensions[slika]

ArrayPlot[slika]

Z uporabo diskretne kosinusne transformacije bomo sliko kompresirali. Najprej na pridruženi matriki izvedemo DCT in nato odrežemo vse člene, ki so manjši od neke predpisane vrednosti. Nato izvedemo inverzno kosinusno transformacijo.

slikadct=FourierDCT[slika]

f[x_]=If[Abs[x]>10,x,0];

slikadctfiltr=Map[f,slikadct,{2}]

Count[slikadctfiltr,0,2]

ArrayPlot[slika]

ArrayPlot[FourierDCT[slikadctfiltr,3]]

Če večamo vrednost, pri kateri odrežemo člene, dobimo boljšo kompresijo. Seveda se kakovost slike pri tem slabša.

f[x_]=If[Abs[x]>20,x,0];

slikadctfiltr=Map[f,slikadct,{2}];

Count[slikadctfiltr,0,2]

ArrayPlot[slika]

ArrayPlot[FourierDCT[slikadctfiltr,3]]

f[x_]=If[Abs[x]>30,x,0];

slikadctfiltr=Map[f,slikadct,{2}];

Count[slikadctfiltr,0,2]

ArrayPlot[slika]

ArrayPlot[FourierDCT[slikadctfiltr,3]]

f[x_]=If[Abs[x]>50,x,0];

slikadctfiltr=Map[f,slikadct,{2}];

Count[slikadctfiltr,0,2]

ArrayPlot[slika]

ArrayPlot[FourierDCT[slikadctfiltr,3]]