Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > C/C++/С#


Ответ
 
Опции темы Опции просмотра
Старый 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 вне форума   Ответить с цитированием
Старый 12.10.2012, 10:15   #2 (permalink)
Fenix
404
 
Аватар для Fenix
 
Регистрация: 10.01.2010
Сообщений: 1,749
Записей в дневнике: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 3868
По умолчанию

А пример можно изображения до и после?
Fenix вне форума   Ответить с цитированием
Старый 12.10.2012, 10:29   #3 (permalink)
Abraziv
Member
 
Регистрация: 28.07.2011
Сообщений: 275
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 193
По умолчанию

от клеток избавился , теперь новая проблема, первый блок 8*8 преобразует нормально , вот выгрузил в файл(для градиента 8*8:
Y
124.679 116.752 106.553 94.8385 81.0799 66.2164 50.362 33.6307
115.761 104.861 92.9707 79.2121 64.2346 48.3802 31.8248 14.6896
103.467 91.1029 77.7033 62.2528 46.3984 30.1401 12.1208 -4.8385
89.5941 76.1254 60.858 43.8296 27.2814 10.139 -7.1102 -24.0695
74.0296 58.2892 42.3208 25.4755 8.3403 -10.0829 -26.8142 -43.3696
56.3074 40.1631 22.9067 6.7624 -11.3637 -28.6201 -45.1683 -62.1967
38.0673 20.9249 3.7897 -13.4595 -30.3048 -47.0361 -63.5915 -79.3319
18.6532 1.6939 -16.0283 -32.8736 -49.7189 -65.5733 -81.0238 -94.7133
ДКП
192.187 289.22 -7.75375 27.4464 -1.60067 8.1423 -0.509043 1.98989
326.828 -19.0021 -11.1418 -2.33136 -2.65121 -0.647843 -0.46592 0.028501
-9.30846 -13.1232 -0.48876 -0.934066 -0.104011 -0.300057 -0.0247304 -0.464285
30.3372 -1.86098 -1.61518 -0.1385 0.109808 0.535232 -0.759577 -0.0174502
-2.34565 -2.54888 0.4512 -0.879114 0.1031 -0.471037 -0.170495 0.138137
9.24078 -0.691439 -0.573555 0.122571 -0.655194 -0.284237 0.117826 -0.0328423
-0.766612 -1.0356 -0.388255 -0.167099 -0.101308 0.0144684 -0.137965 -0.514548
2.14298 -0.11671 -0.404961 0.107704 0.347201 -0.132519 0.337573 0.250838
ОДКП
124.679 116.752 106.553 94.8385 81.0799 66.2164 50.362 33.6307
115.761 104.861 92.9707 79.2121 64.2346 48.3802 31.8248 14.6896
103.467 91.1029 77.7033 62.2528 46.3984 30.1401 12.1208 -4.8385
89.5941 76.1254 60.858 43.8296 27.2814 10.139 -7.1102 -24.0695
74.0296 58.2892 42.3208 25.4755 8.3403 -10.0829 -26.8142 -43.3696
56.3074 40.1631 22.9067 6.7624 -11.3637 -28.6201 -45.1683 -62.1967
38.0673 20.9249 3.7897 -13.4595 -30.3048 -47.0361 -63.5915 -79.3319
18.6532 1.6939 -16.0283 -32.8736 -49.7189 -65.5733 -81.0238 -94.7133

http://www.tehnari.ru/attachment.php...1&d=1350019653

Но для размерности больше 8*8 изображение колечится:

http://www.tehnari.ru/attachment.php...1&d=1350019569

исправленный код:
double temp_Y = 0,pi = 3.14159265358979,Cv,Cu,N,M;
int lim,a,b;

file << endl;
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++)
{
if( y2 == 0)
Cv = sqrt( (double)1/(M));
if( y2 > 0 )
Cv= sqrt( (double) 2/(M));

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

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;
file << DCT1[x2][y2];
file << " ";

}
file << endl;
}
}


file << endl;

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++)
{
if( j == 0)
Cv = sqrt( (double)1/(M));
if( j > 0 )
Cv= sqrt( (double) 2/(M));
for( int i = 0; i < N; i++)
{
if( i == 0)
Cu = sqrt( (double) 1/ (N));
if( i > 0 )
Cu = sqrt( (double)2/ (N));

temp_Y += (double) DCT1[x1+i][y1+j] *Cv * Cu * cos( pi/N *( (x2-x1) + 0.5 )*i ) * cos( pi/M *((y2-y1) + 0.5 )*j);
}
}
Y[x2][y2] = temp_Y + 128;
file << Y[x2][y2];
file << " ";
temp_Y = 0;
}
file << endl;
}
}
Миниатюры
nieiie.jpg   nieiie2.png  
Abraziv вне форума   Ответить с цитированием
Ads

Яндекс

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

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 14:37.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.