Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <imgproc.hpp>
- #include <highgui.hpp>
- #include <iostream>
- #include <cmath>
- #include "windows.h"
- cv::Mat img = cv::imread("X:/Visual Studio/Images/clintsmall.jpg");
- void bin_er (const cv::Mat& input_img, cv::Mat& output_img) {
- output_img = input_img.clone();
- for (int i = 1; i < input_img.rows - 1; i++)
- for (int j = 1; j < input_img.cols - 1; j++) {
- int cnt = 0;
- for (int ii = -1; ii <= 1; ii++)
- for (int jj = -1; jj <= 1; jj++) {
- if (input_img.at<uchar>(i - ii, j - jj) == 0)
- cnt++;
- }
- if (cnt > 0)
- output_img.at<uchar>(i, j) = 0;
- }
- }
- void bin_dil (const cv::Mat& input_img, cv::Mat& output_img) {
- output_img = input_img.clone();
- for (int i = 1; i < input_img.rows - 1; i++)
- for (int j = 1; j < input_img.cols - 1; j++) {
- int cnt = 0;
- for (int ii = -1; ii <= 1; ii++)
- for (int jj = -1; jj <= 1; jj++) {
- if (input_img.at<uchar>(i - ii, j - jj) == 255)
- cnt++;
- }
- if (cnt > 0)
- output_img.at<uchar>(i, j) = 255;
- }
- }
- void ht_er (const cv::Mat& input_img, cv::Mat& output_img) {
- output_img = cv::Mat::zeros(input_img.size(), CV_8U);
- for (int i = 1; i < input_img.rows - 1; i++)
- for (int j = 1; j < input_img.cols - 1; j++) {
- float min = 255;
- uchar pix_value = input_img.at<uchar>(i, j);
- for (int ii = -1; ii <= 1; ii++)
- for (int jj = -1; jj <= 1; jj++) {
- uchar Y = input_img.at<uchar>(i - ii, j - jj);
- if (Y < min) min = Y;
- }
- output_img.at<uchar>(i, j) = min;
- }
- }
- void ht_dil (const cv::Mat& input_img, cv::Mat& output_img) {
- output_img = cv::Mat::zeros(input_img.size(), CV_8U);
- for (int i = 1; i < input_img.rows - 1; i++)
- for (int j = 1; j < input_img.cols - 1; j++) {
- float max = 0;
- uchar pix_value = input_img.at<uchar>(i, j);
- for (int ii = -1; ii <= 1; ii++)
- for (int jj = -1; jj <= 1; jj++) {
- uchar Y = input_img.at<uchar>(i - ii, j - jj);
- if (Y > max) max = Y;
- }
- output_img.at<uchar>(i, j) = max;
- }
- }
- void fcontour(const cv::Mat& input_img, cv::Mat& output_img, int n) {
- int cycle = 0;
- output_img = cv::Mat::zeros(input_img.size(), CV_8U);
- cv::Mat prep = input_img.clone();
- while (cycle < n) {
- for (int i = 1; i < prep.rows - 1; i++)
- for (int j = 1; j < prep.cols - 1; j++) {
- float min = 255;
- uchar pix_value = prep.at<uchar>(i, j);
- for (int ii = -1; ii <= 1; ii++)
- for (int jj = -1; jj <= 1; jj++) {
- uchar Y = prep.at<uchar>(i - ii, j - jj);
- if (Y < min) min = Y;
- }
- output_img.at<uchar>(i, j) = min;
- }
- prep = output_img.clone();
- cycle++;
- }
- cv::subtract(input_img, prep, output_img);
- }
- void fcontoursym(const cv::Mat& input_img, cv::Mat& output_img, int n) {
- int cycle = 0;
- cv::Mat res_1 = cv::Mat::zeros(input_img.size(), CV_8U);
- cv::Mat prep1 = input_img.clone();
- while (cycle < n) {
- for (int i = 1; i < prep1.rows - 1; i++)
- for (int j = 1; j < prep1.cols - 1; j++) {
- float min = 255;
- uchar pix_value = prep1.at<uchar>(i, j);
- for (int ii = -1; ii <= 1; ii++)
- for (int jj = -1; jj <= 1; jj++) {
- uchar Y = prep1.at<uchar>(i - ii, j - jj);
- if (Y < min) min = Y;
- }
- res_1.at<uchar>(i, j) = min;
- }
- prep1 = res_1.clone();
- cycle++;
- }
- cycle = 0;
- cv::Mat res_2 = cv::Mat::zeros(input_img.size(), CV_8U);
- cv::Mat prep2 = input_img.clone();
- while (cycle < n) {
- for (int i = 1; i < prep2.rows - 1; i++)
- for (int j = 1; j < prep2.cols - 1; j++) {
- float max = 0;
- uchar pix_value = prep2.at<uchar>(i, j);
- for (int ii = -1; ii <= 1; ii++)
- for (int jj = -1; jj <= 1; jj++) {
- uchar Y = prep2.at<uchar>(i - ii, j - jj);
- if (Y > max) max = Y;
- }
- res_2.at<uchar>(i, j) = max;
- }
- prep2 = res_2.clone();
- cycle++;
- }
- cv::subtract(prep2, prep1, output_img);
- }
- void morph(const cv::Mat& input_img, cv::Mat output_img) {
- cv::Mat prep1 = cv::Mat::zeros(input_img.size(), CV_8U);
- for (int i = 1; i < input_img.cols - 1; i++)
- for (int j = 1; j < input_img.rows - 1; j++) {
- float max = 0;
- float min = 255;
- for (int ii = -1; ii <= 1; ii++)
- for (int jj = -1; jj <= 1; jj++) {
- uchar Y_min = input_img.at<uchar>(j + jj, i + ii);
- uchar Y_max = input_img.at<uchar>(j + jj, i + ii);
- if (Y_max > max)
- max = Y_max;
- if (Y_min < min)
- min = Y_min;
- }
- prep1.at<uchar>(j, i) = (max - min);
- }
- cv::Mat prep2 = cv::Mat::zeros(input_img.size(), CV_8U);
- for (int i = 2; i < input_img.cols - 2; i++)
- for (int j = 2; j < input_img.rows - 2; j++) {
- float max = 0;
- float min = 255;
- for (int ii = -2; ii <= 2; ii++)
- for (int jj = -2; jj <= 2; jj++) {
- uchar Y_min = input_img.at<uchar>(j + jj, i + ii);
- uchar Y_max = input_img.at<uchar>(j + jj, i + ii);
- if (Y_max > max)
- max = Y_max;
- if (Y_min < min)
- min = Y_min;
- }
- prep2.at<uchar>(j, i) = (max - min);
- }
- cv::Mat prep21 = cv::Mat::zeros(prep2.size(), CV_8U);
- for (int i = 1; i < prep2.cols - 1; i++)
- for (int j = 1; j < prep2.rows - 1; j++) {
- float min = 255;
- for (int ii = -1; ii <= 1; ii++)
- for (int jj = -1; jj <= 1; jj++) {
- uchar Y = prep2.at<uchar>(j + jj, i + ii);
- if (Y < min)
- min = Y;
- }
- prep21.at<uchar>(j, i) = min;
- }
- cv::Mat prep3 = cv::Mat::zeros(input_img.size(), CV_8U);
- for (int i = 3; i < input_img.cols - 3; i++)
- for (int j = 3; j < input_img.rows - 3; j++) {
- float max = 0;
- float min = 255;
- for (int ii = -3; ii <= 3; ii++)
- for (int jj = -3; jj <= 3; jj++) {
- uchar Y_min = input_img.at<uchar>(j + jj, i + ii);
- uchar Y_max = input_img.at<uchar>(j + jj, i + ii);
- if (Y_max > max)
- max = Y_max;
- if (Y_min < min)
- min = Y_min;
- }
- prep3.at<uchar>(j, i) = (max - min);
- }
- cv::Mat prep31 = cv::Mat::zeros(prep3.size(), CV_8U);
- for (int i = 2; i < prep3.cols - 2; i++)
- for (int j = 2; j < prep3.rows - 2; j++) {
- float min = 255;
- for (int ii = -2; ii <= 2; ii++)
- for (int jj = -2; jj <= 2; jj++) {
- uchar Y = prep3.at<uchar>(j + jj, i + ii);
- if (Y < min)
- min = Y;
- }
- prep31.at<uchar>(j, i) = min;
- }
- cv::Mat prep1f;
- prep1.convertTo(prep1f, CV_64F);
- cv::Mat prep2f;
- prep21.convertTo(prep2f, CV_64F);
- cv::Mat prep3f;
- prep31.convertTo(prep3f, CV_64F);
- cv::Mat SUM;
- SUM = prep1f + prep2f + prep3f;
- SUM = SUM / 3;
- SUM.convertTo(output_img, CV_8U);
- }
- int main() {
- cv::Mat htimg = cv::Mat::zeros(img.size(), CV_8UC1);
- cv::Mat binimg = cv::Mat::zeros(img.size(), CV_8UC1);
- cv::Mat bineroded = cv::Mat::zeros(img.size(), CV_8UC1);
- cv::Mat bindilated = cv::Mat::zeros(img.size(), CV_8UC1);
- cv::Mat binopened = cv::Mat::zeros(img.size(), CV_8UC1);
- cv::Mat binclosed = cv::Mat::zeros(img.size(), CV_8UC1);
- cv::Mat hteroded = cv::Mat::zeros(img.size(), CV_8UC1);
- cv::Mat htdilated = cv::Mat::zeros(img.size(), CV_8UC1);
- cv::Mat htopened = cv::Mat::zeros(img.size(), CV_8UC1);
- cv::Mat htclosed = cv::Mat::zeros(img.size(), CV_8UC1);
- cv::Mat htcontours = cv::Mat::zeros(img.size(), CV_8UC1);
- cv::Mat htcontourssym = cv::Mat::zeros(img.size(), CV_8UC1);
- cv::Mat htmorphed = cv::Mat::zeros(img.size(), CV_8UC1);
- int N = 3;
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++) {
- 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];
- }
- cv::imshow ("Полутоновое изображение", htimg);
- for (int i = 0; i < binimg.rows; i++)
- for (int j = 0; j < binimg.cols; j++) {
- if (htimg.at<uchar>(i, j) > 125)
- binimg.at<uchar>(i, j) = 255;
- else binimg.at<uchar>(i, j) = 0;
- }
- cv::imshow("Бинарное изображение", binimg);
- cv::waitKey();
- fcontour(htimg, htcontours, N);
- cv::imshow("Поиск контуров", htcontours);
- cv::waitKey();
- fcontoursym(htimg, htcontourssym, N);
- cv::imshow("Блатной поиск контуров", htcontourssym);
- cv::waitKey();
- morph(htimg, htmorphed);
- cv::imshow("Масштабный морфологический градиент", htmorphed);
- cv::waitKey();
- bin_er(binimg, bineroded);
- cv::imshow("Бинарная эрозия", bineroded);
- cv::waitKey();
- bin_dil(binimg, bindilated);
- cv::imshow("Бинарная дилатация", bindilated);
- cv::waitKey();
- bin_dil(bineroded, binopened);
- cv::imshow("Бинарное открытие", binopened);
- cv::waitKey();
- bin_er(bindilated, binclosed);
- cv::imshow("Бинарное закрытие", binclosed);
- cv::waitKey();
- cv::destroyAllWindows();
- ht_er(htimg, hteroded);
- cv::imshow("Полутоновая эрозия", hteroded);
- cv::waitKey();
- ht_dil(htimg, htdilated);
- cv::imshow("Полутоновая дилатация", htdilated);
- cv::waitKey();
- ht_dil(hteroded, htopened);
- cv::imshow("Полутоновое открытие", htopened);
- cv::waitKey();
- ht_er(htdilated, htclosed);
- cv::imshow("Полутоновое закрытие", htclosed);
- cv::waitKey();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement