Når jeg lige har tid prøver jeg stadig at lege lidt med jpeg og dct.
Jeg mener jeg har implementeret det korrekt nu, men synes egentlig den
grafiske fejl er lidt for stor.
Helt generelt.. er dette korrekt.
Man tager en 8*8 matrise med værdier fra 0..255.
Denne ganger man på en 8*8 matrise repræsenterende cosinustransformationen.
Denne matrise er
0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 0.3536
0.3536
0.4904 0.4157 0.2778
0.0975 -0.0975 -0.2778 -0.4157 -0.4904
0.4619 0.1913 -0.1913 -0.4619 -0.4619 -0.1913 0.1913
0.4619
0.4157 -0.0975 -0.4904 -0.2778 0.2778 0.4904
0.0975 -0.4157
0.3536 -0.3536 -0.3536 0.3536 0.3536 -0.3536 -0.3536
0.3536
0.2778 -0.4904 0.0975 0.4157 -0.4157 -0.0975
0.4904 -0.2778
0.1913 -0.4619 0.4619 -0.1913 -0.1913 0.4619 -0.4619
0.1913
0.0975 -0.2778 0.4157 -0.4904 0.4904 -0.4157
0.2778 -0.0975
Derefter deler man de resulterende kvotienter med en kvantifiseringsmatrise,
som for lysstyrken (Y i Y,Cr,Cb) er
16 11 10 16 24 40 51 61
12 12 14 19 26 58 60 55
14 13 16 24 40 57 69 56
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99
Den resultaerende kvantificerede kvotientmatrise behandles nu sådan at
værdier med en absolut værdi på mindre end 1, sættes til nul. 0.5->0 og 1.2
= 1.2. Dette resultat kodes videre og pakkes senere ud igen, men lad os lige
springe den del over i første omgang.
Man gendanner så kvotienterne ved at gange den reducerede dividerede matrise
fra før og denne gang gange den kvantificeringsmatrisen. Her har vi så
mistet de kvotienter som tidligere ved division blev mindre end 1, og så
blev sat til 0. Ellers er resten tilbage i næsten oprindelig form, bortset
fra afrundingsfejlene.
Denne rekonstruerede kvotientmatrise ganges så med den transposed (hvad er
det på dansk?)dct matrise for at få det oprindelige retur.
rekonstrueret billede=dctmatrise' * gendannede kvotientmatrise.
gør jeg dette, så ser det nogenlunde ud, men enkelte steder er pixels
flippet ganske meget rundt. Trækker jeg det omridnelige billede fra den
gendannede med standard kvantificering, så får jeg
-0.0395 5.5638 -8.0963 -14.9398 -4.1366 60.5887
9.5876 -38.2796
-0.0484 -17.1543 22.9633 23.3398 4.1719 -97.6373 -24.2329
0.2598
-0.0250
24.5635 -34.4552 -20.6720 -19.3394 -22.2108 -31.5856 -1.3611
-0.0372 -18.0411 40.5609 20.5841 23.7551 22.7217 82.1834
16.5938
-0.0307 -5.9795 -40.6245 -21.8796 11.3445
6.1227 -26.3380 -8.1438
-0.0259 33.1812 34.3454 43.5371 -15.3607 44.1225 23.7110
10.3980
-0.0391 -40.7232 -23.0212 -46.2463 -2.3266
3.5293 -84.2592 -9.5277
-0.0504 18.2591 8.0324 16.1168 1.5887 -17.5322 50.7276
29.6875
en enkelt værdi er ændret hele -84, hvilket bestemt virker i overkanten.
Laver jeg en fejl her? Er dette ikke korrekt
K=DCTMATRIX * IMAGE;
IMAGE=DCTMATRIX' * K;
??
|