Gegeven een NumPy-tabel x
, bestaande uit int
s die ofwel een zwart/wit
afbeelding (2D tabel) ofwel een afbeelding in kleur (3D) voorstelt. We zullen gebruik maken van de
DCT, waarbij we de originele figuur zullen opdelen in rechthoekjes van hoogte
Programmeer volgende functies:
dct2D(x, M, N)
: bereken de getransformeerde figuur door elk rechthoekje met hoogte
x
, die de getransformeerde getallen (float
s) bevat.idct2D(x, M, N)
: analoog, maar nu voor de inverse transformatiecompressie(x, M, N, Z)
: voert de DCT uit op de figuur, zet alle coëfficiënten in elk rechthoekje waarvoor geldt dat x
, bestaande uit float
s) float
die de MSE-waarde voorstelt (fout tussen reconstructie en origineel)
Hoewel de afbeeldingen uit gehele getallen opgebouwd zijn, moet je de transformaties via
float
s uitvoeren.
Opmerkingen:
dct_2()
en idct_2()
hoef je niet mee in te dienen (een implementatie hiervan is beschikbaar
voor het verbeterscript). Je kan er natuurlijk voor kiezen om die functies wel degelijk mee in te dienen.r = np.array( [[ 0, 1, 2, 3, 4, 5, 6, 7], [ 8, 9, 10, 11, 12, 13, 14, 15], [16, 17, 18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29, 30, 31], [32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47]]) r_dct = dct2D(r, 3, 4) #[[ 1.14000000e+02 -9.46296609e+00 -1.77635684e-15 -6.72512294e-01 # 1.62000000e+02 -9.46296609e+00 -5.32907052e-15 -6.72512294e-01] # [-5.54256258e+01 -8.88178420e-16 1.30038346e-15 3.55271368e-15 # -5.54256258e+01 -8.88178420e-16 2.55645743e-15 3.55271368e-15] # [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 # 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] # [ 4.02000000e+02 -9.46296609e+00 -1.06581410e-14 -6.72512294e-01 # 4.50000000e+02 -9.46296609e+00 -1.42108547e-14 -6.72512294e-01] # [-5.54256258e+01 -8.88178420e-16 -3.50840419e-15 3.55271368e-15 # -5.54256258e+01 -8.88178420e-16 5.58888823e-15 3.55271368e-15] # [ 1.42108547e-14 3.94430453e-31 -3.94430453e-31 -7.88860905e-31 # 1.42108547e-14 3.94430453e-31 -3.94430453e-31 -7.88860905e-31]]IDCT
r = np.array([[114.0, -9.462966089696849, -1.7763568394002505e-15, -0.6725122937519501, 162.0, -9.462966089696845, -5.329070518200751e-15, -0.6725122937519572], [-55.42562584220408, -8.881784197001252e-16, 1.300383458813452e-15, 3.552713678800501e-15, -55.42562584220407, -8.881784197001252e-16, 2.556457425760472e-15, 3.552713678800501e-15], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [402.0, -9.462966089696849, -1.0658141036401503e-14, -0.6725122937519643, 450.0, -9.462966089696828, -1.4210854715202004e-14, -0.6725122937519927], [-55.42562584220407, -8.881784197001252e-16, -3.5084041869340696e-15, 3.552713678800501e-15, -55.425625842204056, -8.881784197001252e-16, 5.588888232107742e-15, 3.552713678800501e-15], [1.4210854715202004e-14, 3.944304526105059e-31, -3.944304526105059e-31, -7.888609052210118e-31, 1.4210854715202004e-14, 3.944304526105059e-31, -3.944304526105059e-31, -7.888609052210118e-31]]) r_idct = idct2D(r_dct, 3, 4) #[[-1.18423789e-15 1.00000000e+00 2.00000000e+00 3.00000000e+00 # 4.00000000e+00 5.00000000e+00 6.00000000e+00 7.00000000e+00] # [ 8.00000000e+00 9.00000000e+00 1.00000000e+01 1.10000000e+01 # 1.20000000e+01 1.30000000e+01 1.40000000e+01 1.50000000e+01] # [ 1.60000000e+01 1.70000000e+01 1.80000000e+01 1.90000000e+01 # 2.00000000e+01 2.10000000e+01 2.20000000e+01 2.30000000e+01] # [ 2.40000000e+01 2.50000000e+01 2.60000000e+01 2.70000000e+01 # 2.80000000e+01 2.90000000e+01 3.00000000e+01 3.10000000e+01] # [ 3.20000000e+01 3.30000000e+01 3.40000000e+01 3.50000000e+01 # 3.60000000e+01 3.70000000e+01 3.80000000e+01 3.90000000e+01] # [ 4.00000000e+01 4.10000000e+01 4.20000000e+01 4.30000000e+01 # 4.40000000e+01 4.50000000e+01 4.60000000e+01 4.70000000e+01]]compressie
r = np.array( [[ 0, 1, 2, 3, 4, 5, 6, 7], [ 8, 9, 10, 11, 12, 13, 14, 15], [16, 17, 18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29, 30, 31], [32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47]]) r_rec, MSE = compressie(r, 3, 4, 2) #[[4.28932188e-02 8.96446609e-01 2.10355339e+00 2.95710678e+00 # 4.04289322e+00 4.89644661e+00 6.10355339e+00 6.95710678e+00] # [8.04289322e+00 8.89644661e+00 1.01035534e+01 1.09571068e+01 # 1.20428932e+01 1.28964466e+01 1.41035534e+01 1.49571068e+01] # [1.60428932e+01 1.68964466e+01 1.81035534e+01 1.89571068e+01 # 2.00428932e+01 2.08964466e+01 2.21035534e+01 2.29571068e+01] # [2.40428932e+01 2.48964466e+01 2.61035534e+01 2.69571068e+01 # 2.80428932e+01 2.88964466e+01 3.01035534e+01 3.09571068e+01] # [3.20428932e+01 3.28964466e+01 3.41035534e+01 3.49571068e+01 # 3.60428932e+01 3.68964466e+01 3.81035534e+01 3.89571068e+01] # [4.00428932e+01 4.08964466e+01 4.21035534e+01 4.29571068e+01 # 4.40428932e+01 4.48964466e+01 4.61035534e+01 4.69571068e+01]] # 0.006282