Advertisement
bartek27210

techniki multimedialne llab4

May 27th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.35 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. int qL=1;
  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.  float qMatrix[8][8] =   { 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.                             };
  43.     // TODO
  44.         // podział obrazu na bloki
  45.        
  46.     for(int i=0; i< fruitsPixels.rows; i++){
  47.         for(int j=0; j< fruitsPixels.cols; j++){
  48.             block[i/8][j/8][i%8][j%8]=fruitsPixels[i][j];
  49.         }
  50.     }
  51.         // zerowanie blockDCT i blockIDCT
  52.     for(int i=0; i< fruitsPixels.rows; i++){
  53.         for(int j=0; j< fruitsPixels.cols; j++){
  54.             blockDCT[i/8][j/8][i%8][j%8]=0;
  55.             blockIDCT[i/8][j/8][i%8][j%8]=0;
  56.         }
  57.     }
  58.        
  59.  
  60.     for(int i=0; i< 8 ;i++){
  61.         for(int j=0; j< 8; j++){
  62.             block[0][0][i][j]=0;
  63.         }
  64.     }
  65.    
  66.     // TODO
  67.         // DCT
  68.     for (int i=0; i<blockRows; i++) {
  69.         for (int j=0; j<blockCols; j++) {
  70.             for (int u=0; u<8; u++) {
  71.                 for (int v=0; v<8; v++) {
  72.                     for (int m=0; m<8; m++) {
  73.                         for (int n=0; n<8; n++) {
  74.                             blockDCT[i][j][u][v]+=1.0/64*block[i][j][m][n]*cos((2*m+1)*u*PI/16)*cos((2*n+1)*v*PI/16);
  75.                         }
  76.                     }
  77.                 }
  78.             }
  79.         }
  80.     }
  81.  
  82.  
  83.             qL = 10;
  84.  
  85.         for(int i = 0; i < 8; i++){
  86.             for(int j = 0; j < 8; j++){
  87.                 qMatrix[i][j] = qMatrix[i][j] * (float)(100-qL)/99 * 0.18 + 0.02;
  88.             }
  89.         }
  90.         // kwantyzacja
  91.        
  92.      for(int i = 0; i < blockRows; i++){
  93.             for(int j = 0; j < blockCols; j++){
  94.                     for(int m = 0; m < 8; m++){
  95.                         for(int n = 0; n < 8; n++){
  96.                             blockDCT[i][j][m][n] = (int)((blockDCT[i][j][m][n] / qMatrix[m][n]) + 0.5);
  97.                     }
  98.                 }
  99.             }
  100.         }
  101.  // dekwantyzacja
  102.         for(int i = 0; i < blockRows; i++){
  103.             for(int j = 0; j < blockCols; j++){
  104.                     for(int m = 0; m < 8; m++){
  105.                         for(int n = 0; n < 8; n++){
  106.                             blockDCT[i][j][m][n] = (int)(blockDCT[i][j][m][n] * qMatrix[m][n]);
  107.                     }
  108.                 }
  109.             }
  110.         }
  111.         // IDCT
  112.  
  113.     for (int i=0; i<blockRows; i++) {
  114.         for (int j=0; j<blockCols; j++) {
  115.             for (int u=0; u<8; u++) {
  116.                 for (int v=0; v<8; v++) {
  117.                     for (int m=0; m<8; m++) {
  118.                         for (int n=0; n<8; n++) {
  119.                             int lambda1=0;
  120.                             if(u==0) lambda1=1;
  121.                             else lambda1=2;
  122.                             int lambda2=0;
  123.                             if(v==0) lambda2=1;
  124.                             else lambda2=2;
  125.                             blockIDCT[i][j][m][n]+=lambda1*lambda2*blockDCT[i][j][u][v]*cos((2*m+1)*u*PI/16)*cos((2*n+1)*v*PI/16);
  126.                         }
  127.                     }
  128.                 }
  129.             }
  130.         }
  131.     }
  132.  
  133.     // TODO
  134.         // "składanie" obrazu z bloków
  135.  
  136.     for(int i=0; i< fruitsPixels.rows; i++){
  137.         for(int j=0; j< fruitsPixels.cols; j++){
  138.            
  139.             if(blockIDCT[i/8][j/8][i%8][j%8]>255) blockIDCT[i/8][j/8][i%8][j%8]=255;
  140.             if(blockIDCT[i/8][j/8][i%8][j%8]<0) blockIDCT[i/8][j/8][i%8][j%8]=0;
  141.             fruitsPixels[i][j]=blockIDCT[i/8][j/8][i%8][j%8];
  142.            
  143.         }
  144.     }
  145.  
  146.     // Wyświetlenie obrazu
  147.     imshow("JPEG", imageFruits);
  148.  
  149.     // Oczekiwanie na wciśnięcie klawisza Esc lub Enter
  150.     char key;
  151.     do  key = cvWaitKey(1);
  152.     while(key != 27 && key != 13);
  153.  
  154.     // Niszczenie okna
  155.     cvDestroyWindow("JPEG");
  156.     return 0;
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement