Advertisement
Guest User

Untitled

a guest
Apr 18th, 2021
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.07 KB | None | 0 0
  1. #include <imgproc.hpp>
  2. #include <highgui.hpp>
  3. #include <iostream>
  4. #include <cmath>
  5. #include "windows.h"
  6.  
  7. cv::Mat img = cv::imread("X:/Visual Studio/Images/clintsmall.jpg");
  8.  
  9. void bin_er (const cv::Mat& input_img, cv::Mat& output_img) {
  10.     output_img = input_img.clone();
  11.     for (int i = 1; i < input_img.rows - 1; i++)
  12.         for (int j = 1; j < input_img.cols - 1; j++) {
  13.             int cnt = 0;
  14.             for (int ii = -1; ii <= 1; ii++)
  15.                 for (int jj = -1; jj <= 1; jj++) {
  16.                     if (input_img.at<uchar>(i - ii, j - jj) == 0)
  17.                         cnt++;
  18.                 }
  19.             if (cnt > 0)
  20.                 output_img.at<uchar>(i, j) = 0;
  21.         }
  22. }
  23.  
  24. void bin_dil (const cv::Mat& input_img, cv::Mat& output_img) {
  25.     output_img = input_img.clone();
  26.     for (int i = 1; i < input_img.rows - 1; i++)
  27.         for (int j = 1; j < input_img.cols - 1; j++) {
  28.             int cnt = 0;
  29.             for (int ii = -1; ii <= 1; ii++)
  30.                 for (int jj = -1; jj <= 1; jj++) {
  31.                     if (input_img.at<uchar>(i - ii, j - jj) == 255)
  32.                         cnt++;
  33.                 }
  34.             if (cnt > 0)
  35.                 output_img.at<uchar>(i, j) = 255;
  36.         }
  37. }
  38.  
  39. void ht_er (const cv::Mat& input_img, cv::Mat& output_img) {
  40.     output_img = cv::Mat::zeros(input_img.size(), CV_8U);
  41.     for (int i = 1; i < input_img.rows - 1; i++)
  42.         for (int j = 1; j < input_img.cols - 1; j++) {
  43.             float min = 255;
  44.             uchar pix_value = input_img.at<uchar>(i, j);
  45.             for (int ii = -1; ii <= 1; ii++)
  46.                 for (int jj = -1; jj <= 1; jj++) {
  47.                     uchar Y = input_img.at<uchar>(i - ii, j - jj);
  48.                     if (Y < min) min = Y;
  49.                 }
  50.             output_img.at<uchar>(i, j) = min;
  51.         }
  52. }
  53.  
  54. void ht_dil (const cv::Mat& input_img, cv::Mat& output_img) {
  55.     output_img = cv::Mat::zeros(input_img.size(), CV_8U);
  56.     for (int i = 1; i < input_img.rows - 1; i++)
  57.         for (int j = 1; j < input_img.cols - 1; j++) {
  58.             float max = 0;
  59.             uchar pix_value = input_img.at<uchar>(i, j);
  60.             for (int ii = -1; ii <= 1; ii++)
  61.                 for (int jj = -1; jj <= 1; jj++) {
  62.                     uchar Y = input_img.at<uchar>(i - ii, j - jj);
  63.                     if (Y > max) max = Y;
  64.                 }
  65.             output_img.at<uchar>(i, j) = max;
  66.         }
  67. }
  68.  
  69. void fcontour(const cv::Mat& input_img, cv::Mat& output_img, int n) {
  70.     int cycle = 0;
  71.     output_img = cv::Mat::zeros(input_img.size(), CV_8U);
  72.     cv::Mat prep = input_img.clone();
  73.     while (cycle < n) {
  74.         for (int i = 1; i < prep.rows - 1; i++)
  75.             for (int j = 1; j < prep.cols - 1; j++) {
  76.                 float min = 255;
  77.                 uchar pix_value = prep.at<uchar>(i, j);
  78.                 for (int ii = -1; ii <= 1; ii++)
  79.                     for (int jj = -1; jj <= 1; jj++) {
  80.                         uchar Y = prep.at<uchar>(i - ii, j - jj);
  81.                         if (Y < min) min = Y;
  82.                     }
  83.                 output_img.at<uchar>(i, j) = min;
  84.             }
  85.         prep = output_img.clone();
  86.         cycle++;
  87.     }
  88.     cv::subtract(input_img, prep, output_img);
  89. }
  90.  
  91. void fcontoursym(const cv::Mat& input_img, cv::Mat& output_img, int n) {
  92.     int cycle = 0;
  93.     cv::Mat res_1 = cv::Mat::zeros(input_img.size(), CV_8U);
  94.     cv::Mat prep1 = input_img.clone();
  95.    
  96.     while (cycle < n) {
  97.         for (int i = 1; i < prep1.rows - 1; i++)
  98.             for (int j = 1; j < prep1.cols - 1; j++) {
  99.                 float min = 255;
  100.                 uchar pix_value = prep1.at<uchar>(i, j);
  101.                 for (int ii = -1; ii <= 1; ii++)
  102.                     for (int jj = -1; jj <= 1; jj++) {
  103.                         uchar Y = prep1.at<uchar>(i - ii, j - jj);
  104.                         if (Y < min) min = Y;
  105.                     }
  106.                 res_1.at<uchar>(i, j) = min;
  107.             }
  108.         prep1 = res_1.clone();
  109.         cycle++;
  110.     }
  111.    
  112.     cycle = 0;
  113.     cv::Mat res_2 = cv::Mat::zeros(input_img.size(), CV_8U);
  114.     cv::Mat prep2 = input_img.clone();
  115.  
  116.     while (cycle < n) {
  117.         for (int i = 1; i < prep2.rows - 1; i++)
  118.             for (int j = 1; j < prep2.cols - 1; j++) {
  119.                 float max = 0;
  120.                 uchar pix_value = prep2.at<uchar>(i, j);
  121.                 for (int ii = -1; ii <= 1; ii++)
  122.                     for (int jj = -1; jj <= 1; jj++) {
  123.                         uchar Y = prep2.at<uchar>(i - ii, j - jj);
  124.                         if (Y > max) max = Y;
  125.                     }
  126.                 res_2.at<uchar>(i, j) = max;
  127.             }
  128.         prep2 = res_2.clone();
  129.         cycle++;
  130.     }
  131.  
  132.     cv::subtract(prep2, prep1, output_img);
  133. }
  134.  
  135. void morph(const cv::Mat& input_img, cv::Mat output_img) {
  136.     cv::Mat prep1 = cv::Mat::zeros(input_img.size(), CV_8U);
  137.     for (int i = 1; i < input_img.cols - 1; i++)
  138.         for (int j = 1; j < input_img.rows - 1; j++) {
  139.             float max = 0;
  140.             float min = 255;
  141.             for (int ii = -1; ii <= 1; ii++)
  142.                 for (int jj = -1; jj <= 1; jj++) {
  143.                     uchar Y_min = input_img.at<uchar>(j + jj, i + ii);
  144.                     uchar Y_max = input_img.at<uchar>(j + jj, i + ii);
  145.  
  146.                     if (Y_max > max)
  147.                         max = Y_max;
  148.  
  149.                     if (Y_min < min)
  150.                         min = Y_min;
  151.                 }
  152.             prep1.at<uchar>(j, i) = (max - min);
  153.         }
  154.  
  155.     cv::Mat prep2 = cv::Mat::zeros(input_img.size(), CV_8U);
  156.     for (int i = 2; i < input_img.cols - 2; i++)
  157.         for (int j = 2; j < input_img.rows - 2; j++) {
  158.             float max = 0;
  159.             float min = 255;
  160.             for (int ii = -2; ii <= 2; ii++)
  161.                 for (int jj = -2; jj <= 2; jj++) {
  162.                     uchar Y_min = input_img.at<uchar>(j + jj, i + ii);
  163.                     uchar Y_max = input_img.at<uchar>(j + jj, i + ii);
  164.  
  165.                     if (Y_max > max)
  166.                         max = Y_max;
  167.  
  168.                     if (Y_min < min)
  169.                         min = Y_min;
  170.                 }
  171.             prep2.at<uchar>(j, i) = (max - min);
  172.         }
  173.     cv::Mat prep21 = cv::Mat::zeros(prep2.size(), CV_8U);
  174.     for (int i = 1; i < prep2.cols - 1; i++)
  175.         for (int j = 1; j < prep2.rows - 1; j++) {
  176.             float min = 255;
  177.             for (int ii = -1; ii <= 1; ii++)
  178.                 for (int jj = -1; jj <= 1; jj++) {
  179.                     uchar Y = prep2.at<uchar>(j + jj, i + ii);
  180.                     if (Y < min)
  181.                         min = Y;
  182.                 }
  183.             prep21.at<uchar>(j, i) = min;
  184.         }
  185.  
  186.     cv::Mat prep3 = cv::Mat::zeros(input_img.size(), CV_8U);
  187.     for (int i = 3; i < input_img.cols - 3; i++)
  188.         for (int j = 3; j < input_img.rows - 3; j++) {
  189.             float max = 0;
  190.             float min = 255;
  191.             for (int ii = -3; ii <= 3; ii++)
  192.                 for (int jj = -3; jj <= 3; jj++) {
  193.                     uchar Y_min = input_img.at<uchar>(j + jj, i + ii);
  194.                     uchar Y_max = input_img.at<uchar>(j + jj, i + ii);
  195.  
  196.                     if (Y_max > max)
  197.                         max = Y_max;
  198.  
  199.                     if (Y_min < min)
  200.                         min = Y_min;
  201.                 }
  202.             prep3.at<uchar>(j, i) = (max - min);
  203.         }
  204.  
  205.     cv::Mat prep31 = cv::Mat::zeros(prep3.size(), CV_8U);
  206.     for (int i = 2; i < prep3.cols - 2; i++)
  207.         for (int j = 2; j < prep3.rows - 2; j++) {
  208.             float min = 255;
  209.             for (int ii = -2; ii <= 2; ii++)
  210.                 for (int jj = -2; jj <= 2; jj++) {
  211.                     uchar Y = prep3.at<uchar>(j + jj, i + ii);
  212.                     if (Y < min)
  213.                         min = Y;
  214.                 }
  215.             prep31.at<uchar>(j, i) = min;
  216.         }
  217.  
  218.     cv::Mat prep1f;
  219.     prep1.convertTo(prep1f, CV_64F);
  220.     cv::Mat prep2f;
  221.     prep21.convertTo(prep2f, CV_64F);
  222.     cv::Mat prep3f;
  223.     prep31.convertTo(prep3f, CV_64F);
  224.     cv::Mat SUM;
  225.     SUM = prep1f + prep2f + prep3f;
  226.     SUM = SUM / 3;
  227.     SUM.convertTo(output_img, CV_8U);
  228. }
  229.  
  230. int main() {
  231.     cv::Mat htimg = cv::Mat::zeros(img.size(), CV_8UC1);
  232.     cv::Mat binimg = cv::Mat::zeros(img.size(), CV_8UC1);
  233.  
  234.     cv::Mat bineroded = cv::Mat::zeros(img.size(), CV_8UC1);
  235.     cv::Mat bindilated = cv::Mat::zeros(img.size(), CV_8UC1);
  236.     cv::Mat binopened = cv::Mat::zeros(img.size(), CV_8UC1);
  237.     cv::Mat binclosed = cv::Mat::zeros(img.size(), CV_8UC1);
  238.  
  239.     cv::Mat hteroded = cv::Mat::zeros(img.size(), CV_8UC1);
  240.     cv::Mat htdilated = cv::Mat::zeros(img.size(), CV_8UC1);
  241.     cv::Mat htopened = cv::Mat::zeros(img.size(), CV_8UC1);
  242.     cv::Mat htclosed = cv::Mat::zeros(img.size(), CV_8UC1);
  243.     cv::Mat htcontours = cv::Mat::zeros(img.size(), CV_8UC1);
  244.     cv::Mat htcontourssym = cv::Mat::zeros(img.size(), CV_8UC1);
  245.     cv::Mat htmorphed = cv::Mat::zeros(img.size(), CV_8UC1);
  246.  
  247.     int N = 3;
  248.  
  249.     for (int i = 0; i < img.rows; i++)
  250.         for (int j = 0; j < img.cols; j++) {
  251.             htimg.at<uchar>(i, j) = 0.11 * img.at<cv::Vec3b>(i, j)[0] + 0.53 * img.at<cv::Vec3b>(i, j)[1] + 0.36 * img.at<cv::Vec3b>(i, j)[2];
  252.         }
  253.  
  254.     cv::imshow ("Полутоновое изображение", htimg);
  255.    
  256.     for (int i = 0; i < binimg.rows; i++)
  257.         for (int j = 0; j < binimg.cols; j++) {
  258.             if (htimg.at<uchar>(i, j) > 125)
  259.                 binimg.at<uchar>(i, j) = 255;
  260.             else binimg.at<uchar>(i, j) = 0;
  261.         }
  262.  
  263.     cv::imshow("Бинарное изображение", binimg);
  264.     cv::waitKey();
  265.  
  266.     fcontour(htimg, htcontours, N);
  267.     cv::imshow("Поиск контуров", htcontours);
  268.     cv::waitKey();
  269.  
  270.     fcontoursym(htimg, htcontourssym, N);
  271.     cv::imshow("Блатной поиск контуров", htcontourssym);
  272.     cv::waitKey();
  273.  
  274.     morph(htimg, htmorphed);
  275.     cv::imshow("Масштабный морфологический градиент", htmorphed);
  276.     cv::waitKey();
  277.  
  278.     bin_er(binimg, bineroded);
  279.     cv::imshow("Бинарная эрозия", bineroded);
  280.     cv::waitKey();
  281.  
  282.     bin_dil(binimg, bindilated);
  283.     cv::imshow("Бинарная дилатация", bindilated);
  284.     cv::waitKey();
  285.  
  286.     bin_dil(bineroded, binopened);
  287.     cv::imshow("Бинарное открытие", binopened);
  288.     cv::waitKey();
  289.  
  290.     bin_er(bindilated, binclosed);
  291.     cv::imshow("Бинарное закрытие", binclosed);
  292.     cv::waitKey();
  293.     cv::destroyAllWindows();
  294.  
  295.     ht_er(htimg, hteroded);
  296.     cv::imshow("Полутоновая эрозия", hteroded);
  297.     cv::waitKey();
  298.  
  299.     ht_dil(htimg, htdilated);
  300.     cv::imshow("Полутоновая дилатация", htdilated);
  301.     cv::waitKey();
  302.  
  303.     ht_dil(hteroded, htopened);
  304.     cv::imshow("Полутоновое открытие", htopened);
  305.     cv::waitKey();
  306.  
  307.     ht_er(htdilated, htclosed);
  308.     cv::imshow("Полутоновое закрытие", htclosed);
  309.     cv::waitKey();
  310.    
  311.     return 0;
  312. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement