Предупреждаю - в теории этого преобразования я практически ничего не понимаю, поэтому вопрос может показаться тупым. Пробую выполнить FDCT над матрицей 8x8 со значениями 255. http://en.wikipedia.org/wiki/Discrete_cosine_transform#DCT-II Затем - выполнить над результатом inverse DCT. Но оригинальная 8x8 матрица при этом не восстанавливается. Как выполнить обратное преобразование посредством IDCT? Вот программа на Python:
#!/usr/bin/python
# pixels
MorigB = [
[255,255,255,255,255,255,255,255],
[255,255,255,255,255,255,255,255],
[255,255,255,255,255,255,255,255],
[255,255,255,255,255,255,255,255],
[255,255,255,255,255,255,255,255],
[255,255,255,255,255,255,255,255],
[255,255,255,255,255,255,255,255],
[255,255,255,255,255,255,255,255],
]
from math import sqrt,cos,pi
from sys import stdout
M = 8
N = 8
def dct(a):
F = []
for u in xrange(N):
F = F + [[]]
for v in xrange(M):
s = 0.0
lu = 1.0
if (u == 0): lu = 1/float(sqrt(2))
lv = 1.0
if (v == 0): lv = 1/float(sqrt(2))
for i in xrange(N):
for j in xrange(M):
d = (a[i][j]);
d *= cos(((pi*u)*(2*i+1))/float(2*N))
d *= cos(((pi*v)*(2*j+1))/float(2*M))
s += d
s *= lu
s *= lv
s *= sqrt(2.0/N)
s *= sqrt(2.0/M)
F[u] = F[u] + [s,]
return F
def idct(a):
F = []
for u in xrange(N):
F = F + [[]]
for v in xrange(M):
s = 0.0
for i in xrange(N):
for j in xrange(M):
li = 1
if (i == 0): li = 1/float(sqrt(2))
lj = 1
if (j == 0): lj = 1/float(sqrt(2))
d = (a[i][j]);
d *= cos(((pi*u)*(2*i+1))/float(2*N))
d *= cos(((pi*v)*(2*j+1))/float(2*M))
d *= (li*lj)
s += d
s *= (1/4.0)
F[u] = F[u] + [s,]
return F
def add(a,d):
F = []
for u in xrange(N):
F = F + [[]]
for v in xrange(M):
F[u] = F[u] + [a[u][v]+d,]
return F
def print_(a):
print "---"
for u in xrange(N):
for v in xrange(M):
stdout.write(" %6.0f" % (int(a[u][v])))
stdout.write("\n")
a = add(MorigB,-128)
print_(a)
b = dct(a)
print_(b)
c = idct(b)
d = add(c,+128)
print_(d)
$ ./dct.py
---
127 127 127 127 127 127 127 127
127 127 127 127 127 127 127 127
127 127 127 127 127 127 127 127
127 127 127 127 127 127 127 127
127 127 127 127 127 127 127 127
127 127 127 127 127 127 127 127
127 127 127 127 127 127 127 127
127 127 127 127 127 127 127 127
---
1015 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
---
255 252 245 233 217 198 176 152
252 250 243 231 216 197 175 152
245 243 236 225 210 193 172 150
233 231 225 215 202 186 168 148
217 216 210 202 191 177 162 145
198 197 193 186 177 167 155 141
176 175 172 168 162 155 146 137
152 152 150 148 145 141 137 132