Advertisement
pabloducato

CWICZENIE_NR_4_KOMPRESJA_I_DEKOMPRESJA_JPEGv2

Jun 8th, 2019
368
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.18 KB | None | 0 0
  1. #include "stdafx.h" //CWICZENIE NR 4 KOMPRESJA I DEKOMPRESJA OBRAZOW JPEG
  2. #include <opencv2/imgproc/imgproc.hpp>  // Gaussian Blur
  3. #include <opencv2/core/core.hpp>        // Basic OpenCV structures (CV::Mat, Scalar)
  4. #include <opencv2/highgui/highgui.hpp>
  5. #include <stdio.h>
  6. #include <math.h>
  7. #include <iostream>
  8. #define PI (3.141592653589793)
  9. using namespace std;
  10. using namespace CV;
  11.  
  12. int _tmain(int argc, _TCHAR* argv[])
  13. {
  14.     // Stworzenie okna w którym przechwycone obrazy będą wyświetlane
  15.     cvNamedWindow("JPEG", CV_WINDOW_AUTOSIZE);
  16.     // Pobranie obrazu
  17.     Mat imageFruits = imread("fruits2.jpg",CV_LOAD_IMAGE_GRAYSCALE);
  18.     // Uzyskanie macierzy pikseli na podstawie obiektów Mat
  19.     Mat_<uchar> fruitsPixels = imageFruits;
  20.     const int blockCols = 320/8;
  21.     const int blockRows = 240/8;
  22.     // Utworzenie bloków przechowujących odpowiednio: oryginalny obraz, obraz po DCT, obraz po IDCT
  23.     float block[blockRows][blockCols][8][8];
  24.     float blockDCT[blockRows][blockCols][8][8];
  25.     float blockIDCT[blockRows][blockCols][8][8];
  26.     // TODO
  27.         // podział obrazu na bloki
  28.     for(int i = 0; i<blockRows; i++)
  29.     {
  30.         for(int j = 0; j<blockCols; j++)
  31.         {
  32.             for(int k = 0; k<8; k++)
  33.             {
  34.                 for(int l = 0; l<8; l++)
  35.                 {
  36.                     block[i][j][k][l] = fruitsPixels[i*8 + k][j*8 + l];
  37.                     blockDCT[i][j][k][l] = 0;
  38.                     blockIDCT[i][j][k][l] = 0;
  39.                 }
  40.             }
  41.         }
  42.     }
  43. // zerowanie blockDCT i blockIDCT  
  44. // TODO
  45. // DCT
  46. for(int i = 0; i<blockRows; i++)
  47. {
  48.     for(int j = 0; j<blockCols; j++)
  49.     {
  50.         for(int k = 0; k<8; k++)
  51.         {
  52.             for(int l = 0; l<8; l++)
  53.             {
  54.                 for(int m = 0; m<8; m++)
  55.                 {
  56.                     for(int n = 0; n<8; n++)
  57.                     {
  58.                         blockDCT[i][j][k][l] += block[i][j][m][n] * cos(((2*m + 1)*k*PI)/(2*8)) * cos(((2*n + 1)*l*PI)/(2*8));
  59.                     }
  60.                 }
  61.                 blockDCT[i][j][k][l] /= 64.0;
  62.             }
  63.         }
  64.     }
  65. }
  66. // KWANTYZACJA
  67. float qMatrix[8][8]={
  68.                         {16,11,10,16,24,40,51,61},
  69.                         {12,12,14,19,26,58,60,55},
  70.                         {14,13,16,24,40,57,69,56},
  71.                         {14,17,22,29,51,87,80,62},
  72.                         {18,22,37,56,68,109,103,77},
  73.                         {24,35,55,64,81,104,114,92},
  74.                         {49,64,78,87,103,121,120,101},
  75.                         {72,92,95,98,112,100,103,99}
  76.                     };
  77. float qualityLevel = 50;
  78. for(int i = 0; i < 8; i++)
  79. {
  80.     for (int j = 0; j < 8; j++)
  81.     {
  82.         qMatrix[i][j] = qMatrix[i][j] * ((100 - qualityLevel)/99)*0.18+0.02;
  83.     }
  84. }
  85. for(int i = 0; i < blockRows; i++)
  86. {
  87.     for (int j = 0; j < blockCols; j++)
  88.     {
  89.         for(int k = 0; k < 8; k++)
  90.         {
  91.             for (int l = 0; l < 8; l++)
  92.             {
  93.                 blockDCT[i][j][k][l] = (int)(blockDCT[i][j][k][l] / qMatrix[k][l]);
  94.             }
  95.         }
  96.     }
  97. }
  98. // DEKWANTYZACJA
  99. for(int i = 0; i < blockRows; i++)
  100. {
  101.     for (int j = 0; j < blockCols; j++)
  102.     {
  103.         for(int k = 0; k < 8; k++)
  104.         {
  105.             for (int l = 0; l < 8; l++)
  106.             {
  107.                 blockDCT[i][j][k][l] = blockDCT[i][j][k][l] * qMatrix[k][l];
  108.             }
  109.         }
  110.     }
  111. }
  112. // IDCT
  113. for(int m = 0; m<blockRows; m++)
  114.     {
  115.         for(int n = 0; n<blockCols; n++)
  116.         {
  117.             for(int k = 0; k<8; k++)
  118.             {
  119.                 for(int l = 0; l<8; l++)
  120.                 {
  121.                     for(int i = 0; i<8; i++)
  122.                     {
  123.                         for(int j = 0; j<8; j++)
  124.                         {
  125.                             int CU, CV;
  126.                             if(i == 0) CU = 1;
  127.                             else CU = 2;
  128.                             if(j == 0) CV = 1;
  129.                             else CV = 2;
  130.                             //blockIDCT[i][j][k][l] += CU * CV * blockDCT[i][j][m][n] * cos(((2*k + 1)*m*PI)/(2*8)) * cos(((2*l + 1)*n*PI)/(2*8));
  131.                             blockIDCT[m][n][k][l] += CU * CV * blockDCT[m][n][i][j] * cos(((2*k + 1)*i*PI)/(2*8)) * cos(((2*l + 1)*j*PI)/(2*8));
  132.                         }
  133.                     }
  134.                 }
  135.             }
  136.         }
  137.     }
  138.     // TODO
  139.     // "składanie" obrazu z bloków
  140.     for(int i = 0; i<blockRows; i++)
  141.     {
  142.         for(int j = 0; j<blockCols; j++)
  143.         {
  144.             for(int k = 0; k<8; k++)
  145.             {
  146.                 for(int l = 0; l<8; l++)
  147.                 {
  148.                     blockIDCT[i][j][k][l] > 255 ? blockIDCT[i][j][k][l] = 255 : blockIDCT[i][j][k][l] < 0 ? blockIDCT[i][j][k][l] = 0 : blockIDCT[i][j][k][l] = blockIDCT[i][j][k][l];
  149.                     fruitsPixels[i*8+k][j*8+l] = blockIDCT[i][j][k][l];
  150.                 }
  151.             }
  152.         }
  153.     }
  154.     // Wyświetlenie obrazu
  155.     imshow("JPEG", imageFruits);
  156.     // Oczekiwanie na wciśnięcie klawisza Esc lub Enter
  157.     char key;
  158.     do  key = cvWaitKey(1);
  159.     while(key != 27 && key != 13);
  160.     // Niszczenie okna
  161.     cvDestroyWindow("JPEG");
  162.     return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement