Dopisałem transformację odwrotną, i wykonując:
dct(obraz,transformata);
idct(zrekonstruowany, transformata);
Powinno wyjść mniej więcej to samo, ale no nie wychodzi.
Oto kod:
void dct (short int probki [][8], short int transformata [][8])
{
for (int u=0; u<8; u++)
{
for (int v=0; v<8; v++)
{
double sum=0;
for (int x=0; x<8; x++)
{
for (int y=0; y<8; y++)
{
double cos1=cos(((2*(double)x+1)/16.000*(double)u*3.14));
double cos2=cos(((2*(double)y+1)/16.000*(double)v*3.14));
sum+=probki[x][y]*cos1*cos2;
}
}
double Cu=1;
double Cv=1;
if (u==0)
{
int Cu=1/sqrt(2.0);
}
if (v==0)
{
int Cv=1/sqrt(2.0);
}
transformata [u][v]=sum*Cu*Cv*0.25;
}
}
}
void idct (short int probki [][8], short int transformata [][8])
{
for (int x=0; x<8; x++)
{
for (int y=0; y<8; y++)
{
double sum=0;
for (int u=0; u<8; u++)
{
for (int v=0; v<8; v++)
{
double Cu=1;
double Cv=1;
if (u==0)
{
int Cu=1/sqrt(2.0);
}
if (v==0)
{
int Cv=1/sqrt(2.0);
}
double cos1=cos(((2*(double)x+1)/16.000*(double)u*3.14));
double cos2=cos(((2*(double)y+1)/16.000*(double)v*3.14));
sum+=Cu*Cv*transformata[u][v]*cos1*cos2;
}
}
probki [x][y]=sum*0.25;
}
}
}
Jakby ktoś chciał przetestować to taki przykładowy main:
int main(array<System::String ^> ^args)
{
short int obraz [8][8]=
{-76, -73, -67, -62, -58, -67, -64, -55,
-65, -69, -73, -38, -19 ,-43, -59, -56,
-66, -69, -60, -15, 16 ,-24, -62, -55,
-65, -70, -57, -6, -26 ,-22, -58, -59,
-61, -67, -60, -24, -2 -40, -60, -58,
-49, -63, -68, -58, -51 -60, -70, -53,
-43, -57, -64, -69, -73 -67, -63, -45,
-41, -49, -59, -60, -63 -52, -50, -34};
short int dct2d[8][8];
short int odwrotna [8][8];
dct(obraz, dct2d);
idct( odwrotna, dct2d);
Dajcie chłopaki cynk co tu jest nie tak, bo ja nie ruszy w miarę szybko to leżę i kwiczę:/