Advertisement
Eeedi

Techniki multimedialne lab4

Apr 10th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 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.  
  34.  
  35.     // TODO
  36.     for(int i=0;i<blockRows;i++)
  37.         for(int j=0;j<blockCols;j++)
  38.             for (int k=0;k<8;k++)
  39.                 for(int l=0;l<8;l++)
  40.                 {
  41.                     block[i][j][k][l]=fruitsPixels[i*8+k][j*8+l];
  42.                 }
  43.  
  44.  
  45.  
  46.             //for (int k=0;k<8;k++)
  47.             //  for(int l=0;l<8;l++)
  48.             //  {
  49.             //      block[0][0][k][l]=0;
  50.             //  }
  51.  
  52.         // podział obrazu na bloki
  53.         // zerowanie blockDCT i blockIDCT
  54.     for(int i=0;i<blockRows;i++)
  55.         for(int j=0;j<blockCols;j++)
  56.             for (int k=0;k<8;k++)
  57.                 for(int l=0;l<8;l++)
  58.                 {
  59.                     blockDCT[i][j][k][l]=0;
  60.                     blockIDCT[i][j][k][l]=0;
  61.                 }
  62.        
  63.     // TODO
  64.     // DCT
  65.     float suma=0;
  66.  
  67.     for(int i=0;i<blockRows;i++)
  68.         for(int j=0;j<blockCols;j++)
  69.             for (int k=0;k<8;k++)
  70.                 for(int l=0;l<8;l++)
  71.                 {
  72.                     suma=0;
  73.                     for(int m=0;m<8;m++)
  74.                         for(int n=0; n<8;n++)
  75.                         {
  76.                             suma+=block[i][j][m][n]*cos(((2*m+1)*k*PI)/16.0)*cos(((2*n+1)*l*PI)/16.0);
  77.                         }
  78.                     blockDCT[i][j][k][l]=suma/64.0;
  79.                    
  80.                 }
  81.  
  82.         // kwantyzacja
  83.         // dekwantyzacja
  84.         // IDCT
  85.                 float suma2=0;
  86.     for(int i=0;i<blockRows;i++)
  87.         for(int j=0;j<blockCols;j++)
  88.             for (int k=0;k<8;k++)
  89.                 for(int l=0;l<8;l++)
  90.                 {
  91.                     suma2=0;
  92.                     for(int m=0;m<8;m++)
  93.                         for(int n=0; n<8;n++)
  94.                         {
  95.                             suma2+=((m==0)?1:2)*((n==0)?1:2)*blockDCT[i][j][m][n]*cos(((2*k+1)*m*PI)/16.0)*cos(((2*l+1)*n*PI)/16.0);
  96.                         }
  97.                     blockIDCT[i][j][k][l]=suma2;
  98.                    
  99.                 }
  100.    
  101.  
  102.  
  103.     // TODO
  104.     // "składanie" obrazu z bloków
  105.     for(int i=0;i<blockRows;i++)
  106.         for(int j=0;j<blockCols;j++)
  107.             for (int k=0;k<8;k++)
  108.                 for(int l=0;l<8;l++)
  109.                 {
  110.                     fruitsPixels[i*8+k][j*8+l]=blockIDCT[i][j][k][l];
  111.                 }
  112.  
  113.  
  114.        
  115.  
  116.  
  117.     // Wyświetlenie obrazu
  118.     imshow("JPEG", fruitsPixels);
  119.  
  120.     // Oczekiwanie na wciśnięcie klawisza Esc lub Enter
  121.     char key;
  122.     do  key = cvWaitKey(1);
  123.     while(key != 27 && key != 13);
  124.  
  125.     // Niszczenie okna
  126.     cvDestroyWindow("JPEG");
  127.     return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement