Advertisement
bartek27210

na 4 lab

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