Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <opencv2/imgproc/imgproc.hpp> // Gaussian Blur
- #include <opencv2/core/core.hpp> // Basic OpenCV structures (cv::Mat, Scalar)
- #include <opencv2/highgui/highgui.hpp>
- #include <stdio.h>
- #include <math.h>
- #include <iostream>
- #define PI (3.141592653589793)
- using namespace std;
- using namespace cv;
- int c(int lambda);
- int _tmain(int argc, _TCHAR* argv[])
- {
- // Stworzenie okna w którym przechwycone obrazy będą wyświetlane
- cvNamedWindow("JPEG", CV_WINDOW_AUTOSIZE);
- // Pobranie obrazu
- Mat imageFruits = imread("fruits2.jpg",CV_LOAD_IMAGE_GRAYSCALE);
- // Uzyskanie macierzy pikseli na podstawie obiektów Mat
- Mat_<uchar> fruitsPixels = imageFruits;
- const int blockCols = 320/8;
- const int blockRows = 240/8;
- const int N = 8;
- int qualityLevel = 1;
- // Utworzenie bloków przechowujących odpowiednio: oryginalny obraz, obraz po DCT, obraz po IDCT
- float block[blockRows][blockCols][8][8];
- float blockDCT[blockRows][blockCols][8][8];
- float blockIDCT[blockRows][blockCols][8][8];
- float qMatrix[8][8] = { 16,11,10,16,24,40,51,61,
- 12,12,14,19,26,58,60,55,
- 14,13,16,24,40,57,69,56,
- 14,17,22,29,51,87,80,62,
- 18,22,37,56,68,109,103,77,
- 24,35,55,64,81,104,113,92,
- 49,64,78,87,103,121,120,101,
- 72,92,95,98,112,100,103,99
- };
- // TODO
- // podzial na bloki
- for(int i = 0; i < fruitsPixels.rows; i++){
- for(int j = 0; j < fruitsPixels.cols; j++){
- block[i/8][j/8][i%8][j%8] = fruitsPixels[i][j];
- }
- }
- //for(int i = 0; i<8;i++){
- // for(int j = 0; j<8; j++){
- // block[0][0][i][j] = 0;
- // block[0][1][i][j] = 0;
- // block[1][0][i][j] = 0;
- // block[1][1][i][j] = 0;
- // }
- //}
- // zerowanie blockDCT i blockIDCT
- for(int i = 0; i < fruitsPixels.rows; i++){
- for(int j = 0; j < fruitsPixels.cols; j++){
- blockDCT[i/8][j/8][i%8][j%8] = 0;
- blockIDCT[i/8][j/8][i%8][j%8] = 0;
- }
- }
- // TODO
- // DCT
- for(int i = 0; i < blockRows; i++){
- for(int j = 0; j < blockCols; j++){
- for(int u = 0; u < N; u++){
- for(int v = 0; v < N; v++){
- float sum = 0;
- for(int m = 0; m < N; m++){
- for(int n = 0; n < N; n++){
- sum += block[i][j][m][n] * cos((2*m+1)*u*PI/(2*N)) * cos((2*n+1)*v*PI/(2*N));
- }
- }
- blockDCT[i][j][u][v] = 1.0/(N*N) * sum;
- }
- }
- }
- }
- qualityLevel = 99;
- for(int i = 0; i < 8; i++){
- for(int j = 0; j < 8; j++){
- qMatrix[i][j] = qMatrix[i][j] * (float)(100-qualityLevel)/99 * 0.18 + 0.02;
- }
- }
- // kwantyzacja
- for(int i = 0; i < blockRows; i++){
- for(int j = 0; j < blockCols; j++){
- for(int m = 0; m < 8; m++){
- for(int n = 0; n < 8; n++){
- blockDCT[i][j][m][n] = (int)((blockDCT[i][j][m][n] / qMatrix[m][n]) + 0.5);
- }
- }
- }
- }
- for(int i = 0; i < blockRows; i++){
- for(int j = 0; j < blockCols; j++){
- for(int m = 0; m < 8; m++){
- for(int n = 0; n < 8; n++){
- blockDCT[i][j][m][n] = (int)(blockDCT[i][j][m][n] * qMatrix[m][n]);
- }
- }
- }
- }
- // dekwantyzacja
- //IDCT
- for(int i = 0; i < blockRows; i++){
- for(int j = 0; j < blockCols; j++){
- for(int m = 0; m < N; m++){
- for(int n = 0; n < N; n++){
- float sum = 0;
- for(int u = 0; u < N; u++){
- for(int v = 0; v < N; v++){
- sum += c(u) * c(v) * blockDCT[i][j][u][v] * cos((2*m+1)*u*PI/(2*N)) * cos((2*n+1)*v*PI/(2*N));
- }
- }
- blockIDCT[i][j][m][n] = sum;
- }
- }
- }
- }
- // TODO
- //skladanie
- for(int i = 0; i < fruitsPixels.rows; i++){
- for(int j = 0; j < fruitsPixels.cols; j++){
- float pixel = blockIDCT[i/8][j/8][i%8][j%8];
- if(pixel < 0) pixel = 0;
- if(pixel > 255) pixel = 255;
- fruitsPixels[i][j] = pixel;
- }
- }
- // Wyświetlenie obrazu
- imshow("JPEG", imageFruits);
- // Oczekiwanie na wciśnięcie klawisza Esc lub Enter
- char key;
- do key = cvWaitKey(1);
- while(key != 27 && key != 13);
- // Niszczenie okna
- cvDestroyWindow("JPEG");
- return 0;
- }
- int c(int lambda){
- if(lambda == 0) return 1;
- else return 2;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement