Показать сообщение отдельно
Старый 12.10.2012, 09:02   #1 (permalink)
Abraziv
Member
 
Регистрация: 28.07.2011
Сообщений: 275
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 193
По умолчанию Дискретно-косинусное преобразоване

Всем привет. Вычисляю ДКП (для jpeg) , после перевода изображение становится в клеточку размеров 8*8 , что не так в коде , не вижу ошибок???

double temp_Y = 0,pi = 3.14159265358979,Cv,Cu,N,M;
int lim,a,b;


for(int y1 = 0 ; y1 < myBitmap->Height; y1+=8) //ДКТ для Y
for( int x1 = 0; x1 < myBitmap->Width; x1 +=8)
{
if( lim = (myBitmap->Width - x1 ) < 8 ) a = x1 + lim;
else a = x1 + 8;

if( lim = (myBitmap->Width - y1 ) < 8 ) b = y1 + lim;
else b = y1 + 8;

N = a - x1;
M = b - y1;

for(int y2 = y1 ; y2 < b; y2++)
for( int x2 = x1; x2 < a; x2++)
{
if( x2 == 0)
Cu = sqrt( (double)1/ ( N));
if( x2 > 0 )
Cu = sqrt( (double)2/( N));

if( y2 == 0)
Cv = sqrt( (double)1/(M));
if( y2 > 0 )
Cv= sqrt( (double) 2/(M));

for(int j = 0 ; j < M; j++)
for( int i = 0; i < N; i++)
temp_Y += (double) Y[x1+i][y1+j] * cos( pi/N *( i + 0.5 )*(x2-x1) ) * cos( pi/M *(j + 0.5 )*(y2-y1) );

temp_Y *= (double) Cv * Cu ;
DCT1[x2][y2] = temp_Y ;
temp_Y = 0;

}
}




for(int y1 = 0 ; y1 < myBitmap->Height; y1+=8) //ОДКТ для Y
for( int x1 = 0; x1 < myBitmap->Width; x1 +=8)
{
if( lim = (myBitmap->Width - x1 ) < 8 ) a = x1 + lim;
else a = x1 + 8;

if( lim = (myBitmap->Width - y1 ) < 8 ) b = y1 + lim;
else b = y1 + 8;

N = a - x1;
M = b - y1;

for(int y2 = y1 ; y2 < b; y2++)
{
for( int x2 = x1; x2 < a; x2++)
{
for( int j = 0 ; j < M; j++)
for( int i = 0; i < N; i++)
{
if( i == 0)
Cu = sqrt( (double) 1/ (N));
if( i > 0 )
Cu = sqrt( (double)2/ (N));

if( j == 0)
Cv = sqrt( (double)1/(M));
if( j > 0 )
Cv= sqrt( (double) 2/(M));

temp_Y += (double) DCT1[x1+i][y1+j] *Cv * Cu * cos( pi/N *( i + 0.5 )*(x2-x1) ) * cos( pi/M *(j + 0.5 )*(y2-y1) );
}
Y[x2][y2] = temp_Y +128;
temp_Y = 0;
}
}
}
алгоритм не оптимизирован, сейчас главное понять где ошибка.
Abraziv вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070