Advertisement
Georgiy031

Untitled

Apr 5th, 2021
802
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.70 KB | None | 0 0
  1. /**
  2. lab-04: Using binarization for image analysis
  3. @file main.cpp
  4. @author Vlad Tishin
  5. @version 1.0 30/03/21
  6. */
  7. #include <opencv2/opencv.hpp>
  8. #include <opencv2/highgui.hpp>
  9. #include <opencv2/imgproc/imgproc.hpp>
  10. #include <opencv2/quality/qualitymse.hpp>
  11. #include <opencv2/quality/qualitypsnr.hpp>
  12. #include <opencv2/quality/qualityssim.hpp>
  13. #include <iostream>
  14. using namespace cv;
  15. using namespace std;
  16. /**
  17. * Implementation of a fast Gaussian local binarization algorithm.
  18. * @param img - image for binarization.
  19. * @param res - output binarized image.
  20. * @param d0 - constant.
  21. * @param k - kernel size
  22. * @param tr - treshold.
  23. */
  24. void bin_gauss(Mat &img, Mat &res, double d0, int k, double tr);
  25. /**
  26. * Implementing the Connectivity Component filter.
  27. * @param img - input image.
  28. * @param mode - 0: x, 1: y, 2: width, 3: height, 4: area.
  29. * @param low - lower bound.
  30. * @param up - upper bound
  31. * @return filtered image.
  32. */
  33. Mat components_filter(const Mat& img, int mode, double low, double up);
  34. /**
  35. * Visualizes the deviation between two images. Paints elements in red and green
  36. colors.
  37. * If the pixel is only on 1 image - red, only on 2 - green.
  38. * @param src - ref bin image.
  39. * @param bin - bin image
  40. * @return deviation image.
  41. */
  42. Mat visualize_diff(const Mat& src, const Mat& bin);
  43. int main( )
  44. {
  45. Mat ref_image = imread("etalon_bin.jpg", IMREAD_GRAYSCALE);
  46. Mat image = imread("src.jpg");
  47. Mat gray, bin_gray, median_bin, filtered_median, deviation;
  48. cvtColor(image, gray, cv::COLOR_BGR2GRAY);
  49. imwrite("g1.png", gray);
  50. adaptiveThreshold(gray, bin_gray, 255, ADAPTIVE_THRESH_GAUSSIAN_C,
  51. THRESH_BINARY, 81, 20);
  52. imwrite("b1.png", bin_gray);
  53. medianBlur(bin_gray, median_bin, 3);
  54. imwrite("f1.png", median_bin);
  55. filtered_median = components_filter(median_bin, 4, 0, 15000);
  56. filtered_median = components_filter(filtered_median, 0, 220, 2250);
  57. filtered_median = components_filter(filtered_median, 1, 135, 2900);
  58. imwrite("v1.png", filtered_median);
  59. cout << "-------------------------------------------------" << endl;
  60. cout << "Binarized image" << endl;
  61. cout << "SSIM: " << cv::quality::QualitySSIM::compute(ref_image, bin_gray,
  62. noArray())[0] << endl;
  63. cout << "PSNR: " << cv::quality::QualityPSNR::compute(ref_image, bin_gray,
  64. noArray())[0] << endl;
  65. cout << "MSE: " << cv::quality::QualityMSE::compute(ref_image, bin_gray,
  66. noArray())[0] << endl << endl;
  67. cout << "Binarized image with median filter" << endl;
  68. cout << "SSIM: " << cv::quality::QualitySSIM::compute(ref_image, median_bin,
  69. noArray())[0] << endl;
  70. cout << "PSNR: " << cv::quality::QualityPSNR::compute(ref_image, median_bin,
  71. noArray())[0] << endl;
  72. cout << "MSE: " << cv::quality::QualityMSE::compute(ref_image, median_bin,
  73. noArray())[0] << endl << endl;
  74. cout << "Binarized image with median and component filters" << endl;
  75. cout << "SSIM: " << cv::quality::QualitySSIM::compute(ref_image,
  76. filtered_median, noArray())[0] << endl;
  77. cout << "PSNR: " << cv::quality::QualityPSNR::compute(ref_image,
  78. filtered_median, noArray())[0] << endl;
  79. cout << "MSE: " << cv::quality::QualityMSE::compute(ref_image,
  80. filtered_median, noArray())[0] << endl;
  81. cout << "-------------------------------------------------"<< endl;
  82. deviation = visualize_diff(ref_image, filtered_median);
  83. imwrite("e1.png", deviation);
  84. bin_gauss(gray, bin_gray, 20, 81, 0.4); // 20 81 0.45
  85. imwrite("b2.png", bin_gray);
  86. medianBlur(bin_gray, median_bin, 3);
  87. imwrite("f2.png", median_bin);
  88. filtered_median = components_filter(median_bin, 4, 0, 15000);
  89. filtered_median = components_filter(filtered_median, 0, 220, 2250);
  90. filtered_median = components_filter(filtered_median, 1, 135, 2900);
  91. imwrite("v2.png", filtered_median);
  92. cout << endl << "-------------------------------------------------" << endl;
  93. cout << "Binarized image";
  94. cout << "SSIM: " << cv::quality::QualitySSIM::compute(ref_image, bin_gray,
  95. noArray())[0] << endl;
  96. cout << "PSNR: " << cv::quality::QualityPSNR::compute(ref_image, bin_gray,
  97. noArray())[0] << endl;
  98. cout << "MSE: " << cv::quality::QualityMSE::compute(ref_image, bin_gray,
  99. noArray())[0] << endl << endl;
  100. cout << "Binarized image with median filter" << endl;
  101. cout << "SSIM: " << cv::quality::QualitySSIM::compute(ref_image, median_bin,
  102. noArray())[0] << endl;
  103. cout << "PSNR: " << cv::quality::QualityPSNR::compute(ref_image, median_bin,
  104. noArray())[0] << endl;
  105. cout << "MSE: " << cv::quality::QualityMSE::compute(ref_image, median_bin,
  106. noArray())[0] << endl << endl;
  107. cout << "Binarized image with median and component filters" << endl;
  108. cout << "SSIM: " << cv::quality::QualitySSIM::compute(ref_image,
  109. filtered_median, noArray())[0] << endl;
  110. cout << "PSNR: " << cv::quality::QualityPSNR::compute(ref_image,
  111. filtered_median, noArray())[0] << endl;
  112. cout << "MSE: " << cv::quality::QualityMSE::compute(ref_image,
  113. filtered_median, noArray())[0] << endl;
  114. cout << "-------------------------------------------------"<< endl;
  115. deviation = visualize_diff(ref_image, filtered_median);
  116. imwrite("e2.png", deviation);
  117. waitKey(0);
  118. return 0;
  119. }
  120. // Implementation of a fast Gaussian local binarization algorithm.
  121. void bin_gauss(Mat &img, Mat &res, double d0, int k, double tr){
  122. Mat G, M, D;
  123. GaussianBlur( img, G, Size(k, k), 0, 0);
  124. absdiff(G, img, M);
  125. GaussianBlur( M, D, Size(k, k), 0, 0);
  126. subtract(G, img, G);
  127. add(D, d0, D);
  128. divide(G, D, G);
  129. #pragma omp parallel for num_threads(4) collapse(2)
  130. for(int i=0; i<res.rows; i++)
  131. for (int j=0; j<res.cols; j++)
  132. res.at<uchar>(i, j) = (G.at<uchar>(i, j) < tr) ? 255 : 0;
  133. }
  134. // Implementing the Connectivity Component filter.
  135. Mat components_filter(const Mat& img, int mode, double low, double up){
  136. const int connectivity_8 = 8;
  137. Mat labels, stats, centroids;
  138. Mat inv_median_bin;
  139. bitwise_not(img, inv_median_bin);
  140. connectedComponentsWithStats(inv_median_bin, labels, stats, centroids,
  141. connectivity_8);
  142. Mat mask(labels.size(), CV_8UC1, Scalar(0));
  143. Mat surfSup_low=stats.col(mode)>low;
  144. Mat surfSup_up=stats.col(mode)<up;
  145. int tmp_label;
  146. for (int i = 0; i < inv_median_bin.rows; i++){
  147. for (int j = 0; j < inv_median_bin.cols ; j++){
  148. tmp_label = labels.at<int>(i,j);
  149. if ( (int) surfSup_low.at<char>(tmp_label,0) == 0 || (int)
  150. surfSup_up.at<char>(tmp_label,0) == 0 )
  151. mask.at<char>(i,j) = (char) 0;
  152. else
  153. mask.at<char>(i,j) = (char) 255;
  154. }
  155. }
  156. Mat r(inv_median_bin.size(), CV_8UC1, Scalar(0));
  157. inv_median_bin.copyTo(r,mask);
  158. bitwise_not(r, r);
  159. return r;
  160. }
  161. // Visualizes the deviation between two images. Paints elements in red and green
  162. colors.
  163. Mat visualize_diff(const Mat& src, const Mat& bin){
  164. Mat res;
  165. bin.copyTo(res);
  166. cvtColor(res,res ,COLOR_GRAY2BGR);
  167. for(int i=0; i<src.rows; i++)
  168. for(int j=0; j<bin.cols; j++) {
  169. int diff = (int) src.at<uchar>(i, j) - (int) bin.at<uchar>(i, j);
  170. if (diff == 0)
  171. continue;
  172. else if (diff > 0) {
  173. res.at<Vec3b>(i, j)[0] = 0;
  174. res.at<Vec3b>(i, j)[1] = 255;
  175. res.at<Vec3b>(i, j)[2] = 0;
  176. }
  177. else if (diff < 0) {
  178. res.at<Vec3b>(i, j)[0] = 0;
  179. res.at<Vec3b>(i, j)[1] = 0;
  180. res.at<Vec3b>(i, j)[2] = 255;
  181. }
  182. }
  183. return res;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement