Advertisement
sildren12

TM lab 4

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