Advertisement
Guest User

Untitled

a guest
May 27th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.41 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 c(int lambda);
  16.  
  17. int _tmain(int argc, _TCHAR* argv[])
  18. {
  19. // Stworzenie okna w którym przechwycone obrazy będą wyświetlane
  20. cvNamedWindow("JPEG", CV_WINDOW_AUTOSIZE);
  21.  
  22. // Pobranie obrazu
  23. Mat imageFruits = imread("fruits2.jpg",CV_LOAD_IMAGE_GRAYSCALE);
  24.  
  25. // Uzyskanie macierzy pikseli na podstawie obiektów Mat
  26. Mat_<uchar> fruitsPixels = imageFruits;
  27.  
  28. const int blockCols = 320/8;
  29. const int blockRows = 240/8;
  30. const int N = 8;
  31. int qualityLevel = 1;
  32. // Utworzenie bloków przechowujących odpowiednio: oryginalny obraz, obraz po DCT, obraz po IDCT
  33. float block[blockRows][blockCols][8][8];
  34. float blockDCT[blockRows][blockCols][8][8];
  35. float blockIDCT[blockRows][blockCols][8][8];
  36.  
  37. float qMatrix[8][8] = { 16,11,10,16,24,40,51,61,
  38. 12,12,14,19,26,58,60,55,
  39. 14,13,16,24,40,57,69,56,
  40. 14,17,22,29,51,87,80,62,
  41. 18,22,37,56,68,109,103,77,
  42. 24,35,55,64,81,104,113,92,
  43. 49,64,78,87,103,121,120,101,
  44. 72,92,95,98,112,100,103,99
  45. };
  46.  
  47.  
  48. // TODO
  49. // podzial na bloki
  50. for(int i = 0; i < fruitsPixels.rows; i++){
  51. for(int j = 0; j < fruitsPixels.cols; j++){
  52. block[i/8][j/8][i%8][j%8] = fruitsPixels[i][j];
  53. }
  54. }
  55.  
  56. //for(int i = 0; i<8;i++){
  57. // for(int j = 0; j<8; j++){
  58. // block[0][0][i][j] = 0;
  59. // block[0][1][i][j] = 0;
  60. // block[1][0][i][j] = 0;
  61. // block[1][1][i][j] = 0;
  62. // }
  63. //}
  64.  
  65. // zerowanie blockDCT i blockIDCT
  66. for(int i = 0; i < fruitsPixels.rows; i++){
  67. for(int j = 0; j < fruitsPixels.cols; j++){
  68. blockDCT[i/8][j/8][i%8][j%8] = 0;
  69. blockIDCT[i/8][j/8][i%8][j%8] = 0;
  70. }
  71. }
  72.  
  73.  
  74. // TODO
  75. // DCT
  76. for(int i = 0; i < blockRows; i++){
  77. for(int j = 0; j < blockCols; j++){
  78. for(int u = 0; u < N; u++){
  79. for(int v = 0; v < N; v++){
  80. float sum = 0;
  81. for(int m = 0; m < N; m++){
  82. for(int n = 0; n < N; n++){
  83. sum += block[i][j][m][n] * cos((2*m+1)*u*PI/(2*N)) * cos((2*n+1)*v*PI/(2*N));
  84. }
  85. }
  86. blockDCT[i][j][u][v] = 1.0/(N*N) * sum;
  87. }
  88. }
  89.  
  90. }
  91. }
  92.  
  93. qualityLevel = 99;
  94.  
  95. for(int i = 0; i < 8; i++){
  96. for(int j = 0; j < 8; j++){
  97. qMatrix[i][j] = qMatrix[i][j] * (float)(100-qualityLevel)/99 * 0.18 + 0.02;
  98. }
  99. }
  100. // kwantyzacja
  101. for(int i = 0; i < blockRows; i++){
  102. for(int j = 0; j < blockCols; j++){
  103. for(int m = 0; m < 8; m++){
  104. for(int n = 0; n < 8; n++){
  105. blockDCT[i][j][m][n] = (int)((blockDCT[i][j][m][n] / qMatrix[m][n]) + 0.5);
  106. }
  107. }
  108. }
  109. }
  110.  
  111. for(int i = 0; i < blockRows; i++){
  112. for(int j = 0; j < blockCols; j++){
  113. for(int m = 0; m < 8; m++){
  114. for(int n = 0; n < 8; n++){
  115. blockDCT[i][j][m][n] = (int)(blockDCT[i][j][m][n] * qMatrix[m][n]);
  116. }
  117. }
  118. }
  119. }
  120. // dekwantyzacja
  121.  
  122. //IDCT
  123. for(int i = 0; i < blockRows; i++){
  124. for(int j = 0; j < blockCols; j++){
  125. for(int m = 0; m < N; m++){
  126. for(int n = 0; n < N; n++){
  127. float sum = 0;
  128. for(int u = 0; u < N; u++){
  129. for(int v = 0; v < N; v++){
  130. 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));
  131. }
  132. }
  133. blockIDCT[i][j][m][n] = sum;
  134. }
  135. }
  136.  
  137. }
  138. }
  139.  
  140.  
  141. // TODO
  142. //skladanie
  143. for(int i = 0; i < fruitsPixels.rows; i++){
  144. for(int j = 0; j < fruitsPixels.cols; j++){
  145. float pixel = blockIDCT[i/8][j/8][i%8][j%8];
  146.  
  147. if(pixel < 0) pixel = 0;
  148. if(pixel > 255) pixel = 255;
  149.  
  150. fruitsPixels[i][j] = pixel;
  151. }
  152. }
  153.  
  154.  
  155. // Wyświetlenie obrazu
  156. imshow("JPEG", imageFruits);
  157.  
  158. // Oczekiwanie na wciśnięcie klawisza Esc lub Enter
  159. char key;
  160. do key = cvWaitKey(1);
  161. while(key != 27 && key != 13);
  162.  
  163. // Niszczenie okna
  164. cvDestroyWindow("JPEG");
  165. return 0;
  166. }
  167.  
  168. int c(int lambda){
  169. if(lambda == 0) return 1;
  170. else return 2;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement