From e657afd5aef2269c26b1d2217546555f5470f72d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaros=C5=82aw=20Wieczorek?= Date: Thu, 15 Apr 2021 20:31:10 +0200 Subject: [PATCH] clean --- 010/README.md | 4 - 010/do_sprawdzenia/cpp/edge_canny.cpp | 289 -------------------------- 010/do_sprawdzenia/cpp/edge_canny.h | 26 --- 010/do_sprawdzenia/cpp/image1.png | Bin 16878 -> 0 bytes 4 files changed, 319 deletions(-) delete mode 100644 010/README.md delete mode 100644 010/do_sprawdzenia/cpp/edge_canny.cpp delete mode 100644 010/do_sprawdzenia/cpp/edge_canny.h delete mode 100644 010/do_sprawdzenia/cpp/image1.png diff --git a/010/README.md b/010/README.md deleted file mode 100644 index b0d566c..0000000 --- a/010/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Rozwiązania laboratoria 10 - -Cały kod znajduje się w katalogu głównym ,,app/cpp/mysimplegimp'' -Zmienieone pliki projektu dla zadania 10-ego znajdują się w katalogu ,,010/do_sprawdzenia/cpp/'' diff --git a/010/do_sprawdzenia/cpp/edge_canny.cpp b/010/do_sprawdzenia/cpp/edge_canny.cpp deleted file mode 100644 index 24e63df..0000000 --- a/010/do_sprawdzenia/cpp/edge_canny.cpp +++ /dev/null @@ -1,289 +0,0 @@ -#include "edge_canny.h" - -#include "blur_gaussian.h" -#include "conversion_grayscale.h" -#include "edge_sobel.h" - -EdgeCanny::EdgeCanny(PNM* img) : - Convolution(img) -{ -} - -EdgeCanny::EdgeCanny(PNM* img, ImageViewer* iv) : - Convolution(img, iv) -{ -} - - -void EdgeCanny::Calculate_XY(int i, int j, enum directions dir, int* x1, int* y1, int* x2, int* y2) -{ - switch (dir) - { - - case TOP_MIDDLE_BOTTOM_MIDDLE: - { - *x1 = i - 1; - *y1 = j; - *x2 = i + 1; - *y2 = j; - break; - } - - case LEFT_MIDDLE_RIGHT_MIDDLE: - { - *x1 = i; - *y1 = j - 1; - *x2 = i; - *y2 = j + 1; - break; - } - - case TOP_RIGHT_BOTTOM_LEFT: - { - *x1 = i - 1; - *y1 = j - 1; - *x2 = i + 1; - *y2 = j + 1; - break; - } - - case TOP_LEFT_BOTTOM_RIGHT: - { - *x1 = i - 1; - *y1 = j + 1; - *x2 = i + 1; - *y2 = j - 1; - break; - } - - } -} - -PNM* EdgeCanny::transform() -{ - int width = image->width(); - int height = image->height(); - - - int upper_thresh = getParameter("upper_threshold").toInt(); - int lower_thresh = getParameter("lower_threshold").toInt(); - - PNM* newImage = new PNM(width, height, image->format()); - - // Create grayscale - ConversionGrayscale* grayscale = new ConversionGrayscale(image); - PNM* gray_image = grayscale->transform(); - - // Blur grayscale - BlurGaussian* blur_gaussian = new BlurGaussian(gray_image); - blur_gaussian->setParameter("size", 3); - blur_gaussian->setParameter("sigma", 1.6); - PNM* blur_image = blur_gaussian->transform(); - - // Calculate Gx and Gy used EdgeSobel - EdgeSobel *es = new EdgeSobel(blur_image); - - math::matrixGx = *es->rawHorizontalDetection(); - math::matrixGy = *es->rawVerticalDetection(); - - // Define directions - - - // Matrix of pixel power - math::matrix pixelPower(width, height); - - // Marix od pixel Angle - math::matrix pixelAngle(width, height); - - // Matrix of pixel directions - math::matrix pixelDirection(width, height); - - // Matrix of edges - math::matrix edges(width, height); - - - for (int i = 0; i < width; i++) - { - for (int j = 0; j < height; j++) - { - // Calculate current pixel angle - pixelAngle[i][j] = atan2(Gy[i][j], Gx[i][j]) * 180 / M_PI; - - // Calculate current pixel power - pixelPower[i][j] = sqrt(pow(Gx[i][j], 2) + pow(Gy[i][j], 2)); - - // Set current pixel direction - if ((pixelAngle[i][j] > 22.5 && pixelAngle[i][j] <= 67.5) || - (pixelAngle[i][j] > 202.5 && pixelAngle[i][j] <= 247.5)) - { - pixelDirection[i][j] = TOP_LEFT_BOTTOM_RIGHT; - } - else if ((pixelAngle[i][j] > 67.5 && pixelAngle[i][j] <= 112.5) || - (pixelAngle[i][j] > 247.5 && pixelAngle[i][j] <= 292.5)) - { - pixelDirection[i][j] = TOP_MIDDLE_BOTTOM_MIDDLE; - } - else if ((pixelAngle[i][j] > 112.5 && pixelAngle[i][j] <= 157.5) || - (pixelAngle[i][j] > 292.5 && pixelAngle[i][j] <= 337.5)) - { - pixelDirection[i][j] = TOP_RIGHT_BOTTOM_LEFT; - } - else - { - pixelDirection[i][j] = LEFT_MIDDLE_RIGHT_MIDDLE; - } - - } - } - - // Detect edges - for (int i = 0; i < width; i++) - { - for (int j = 0; j < height; j++) - { - if (pixelDirection[i][j] == TOP_MIDDLE_BOTTOM_MIDDLE) - { - if (pixelPower[i][j] > pixelPower[i-1][j] && - pixelPower[i][j] > pixelPower[i+1][j] && - pixelPower[i][j] > upper_thresh) - { - edges[i][j] = true; - } - } - else if (pixelDirection[i][j] == LEFT_MIDDLE_RIGHT_MIDDLE) - { - if (pixelPower[i][j] > pixelPower[i][j-1] && - pixelPower[i][j] > pixelPower[i][j+1] && - pixelPower[i][j] > upper_thresh) - { - edges[i][j]=true; - } - } - else if (pixelDirection[i][j] == TOP_LEFT_BOTTOM_RIGHT) - { - if (pixelPower[i][j] > pixelPower[i-1][j+1] && - pixelPower[i][j] > pixelPower[i+1][j-1] && - pixelPower[i][j] > upper_thresh) - { - edges[i][j]=true; - } - } - else if (pixelDirection[i][j] == TOP_RIGHT_BOTTOM_LEFT) - { - if (pixelPower[i][j] > pixelPower[i+1][j+1] && - pixelPower[i][j] > pixelPower[i-1][j-1] && - pixelPower[i][j] > upper_thresh) - { - edges[i][j]=true; - } - } - } - } - - // Set variables - int x1 = 0; - int y1 = 0; - - int x2 = 0; - int y2 = 0; - - for (int i = 0; i < width; i++) - { - for (int j = 0; j < height; j++) - { - if (edges[i][j] == true) - { - Calculate_XY(i, j, pixelDirection[i][j], &x1, &y1, &x2, &y2); - - if (x1 < width && y1 < height && edges[x1][y1] != true) - { - if (pixelPower[x1][y1] > lower_thresh && pixelDirection[x1][y1] == pixelDirection[i][j]) - { - int x11 = 0; - int y11 = 0; - int x12 = 0; - int y12 = 0; - - Calculate_XY(x1, y1, pixelDirection[x1][y1], &x11, &y11, &x12, &y12); - - if (x11 < width && y11 < height && x12 < width && y12 < height) - { - if (pixelPower[x11][y11] < pixelPower[x1][y1] && pixelPower[x12][y12] < pixelPower[x1][y1]) - { - edges[x1][y1] = true; - } - } - else if (x11 < width && y11 < height) - { - if (pixelPower[x11][y11] < pixelPower[x1][y1]) - { - edges[x1][y1] = true; - } - } - else if (x12 < width && y12 < height) - { - if (pixelPower[x12][y12] < pixelPower[x1][y1]) - { - edges[x1][y1] = true; - } - } - - } - } - - if (x2 < width && y2 < height && edges[x2][y2] != true) - { - if (pixelPower[x2][y2] > lower_thresh && pixelDirection[x2][y2] == pixelDirection[i][j]) - { - int x21 = 0; - int y21 = 0; - int x22 = 0; - int y22 = 0; - - Calculate_XY(x2, y2, pixelDirection[x2][y2], &x21, &y21, &x22, &y22); - - if (x21 < width && y21 < height && x22 < width && y22 < height) - { - if (pixelPower[x21][y21] < pixelPower[x2][y2] && pixelPower[x22][y22] < pixelPower[x2][y2]) - { - edges[x2][y2] = true; - } - } - else if (x21 < width && y21 < height) - { - if (pixelPower[x21][y21] < pixelPower[x2][y2]) - { - edges[x2][y2] = true; - } - } - else if (x22 < width && y22 < height) - { - if (pixelPower[x22][y22] < pixelPower[x2][y2]) - { - edges[x2][y2] = true; - } - } - } - } - } - } - } - - // Prepare new image - for (int i = 0; i < width; i++) - { - for (int j = 0; j < height; j++) - { - if (edges[i][j] == true) - { - newImage->setPixel(i, j, 255); - } - else - { - newImage->setPixel(i, j, 0); - } - } - } - - return newImage; -} diff --git a/010/do_sprawdzenia/cpp/edge_canny.h b/010/do_sprawdzenia/cpp/edge_canny.h deleted file mode 100644 index 71f1e9c..0000000 --- a/010/do_sprawdzenia/cpp/edge_canny.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef EDGECANNY_H -#define EDGECANNY_H - -#include "convolution.h" - -class EdgeCanny : public Convolution -{ -public: - EdgeCanny(PNM*); - EdgeCanny(PNM*, ImageViewer*); - - virtual PNM* transform(); - enum directions { - TOP_LEFT_BOTTOM_RIGHT, - TOP_RIGHT_BOTTOM_LEFT, - TOP_MIDDLE_BOTTOM_MIDDLE, - LEFT_MIDDLE_RIGHT_MIDDLE - }; - - void Calculate_XY(int i, int j, enum directions dir, int* x1, int* y1, int* x2, int* y2); - -private: - -}; - -#endif // EDGECANNY_H diff --git a/010/do_sprawdzenia/cpp/image1.png b/010/do_sprawdzenia/cpp/image1.png deleted file mode 100644 index 72413060a3f03728ae63f03a7292da868882bf86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16878 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 #Fcx9 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