Дискретно-косинусное преобразоване
Всем привет. Вычисляю ДКП (для 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; } } } алгоритм не оптимизирован, сейчас главное понять где ошибка. |
А пример можно изображения до и после?
|
Вложений: 2
от клеток избавился , теперь новая проблема, первый блок 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; } } |
Часовой пояс GMT +4, время: 03:51. |
Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.