|
|
@@ -1,373 +0,0 @@
|
|
|
-#include "algorithm.h"
|
|
|
-#include "algorithmregistry.h"
|
|
|
-
|
|
|
-
|
|
|
-CannyEdge::CannyEdge() {
|
|
|
- cannyMeta.name = "Canny Edge Detection";
|
|
|
- cannyMeta.addParam("Threshold 1", "double", 50.0, 0.0, 255.0);
|
|
|
- cannyMeta.addParam("Threshold 2", "double", 150.0, 0.0, 255.0);
|
|
|
- cannyMeta.addParam("Aperture Size", "int", 3, 1, 7);
|
|
|
- cannyMeta.addParam("L2 Gradient", "bool", false, 0.0, 1.0);
|
|
|
-}
|
|
|
-
|
|
|
-void CannyEdge::process(cv::Mat image) {
|
|
|
- // Store input parameters
|
|
|
- runtimeParams.inputimage = image.clone(); // Store input image
|
|
|
-
|
|
|
- // Get parameters from cannyMeta
|
|
|
- double threshold1 = 50.0;
|
|
|
- double threshold2 = 150.0;
|
|
|
- int apertureSize = 3;
|
|
|
- bool l2gradient = false;
|
|
|
-
|
|
|
- for (const auto& param : cannyMeta.params) {
|
|
|
- if (param.name == "Threshold 1") threshold1 = param.value.toDouble();
|
|
|
- if (param.name == "Threshold 2") threshold2 = param.value.toDouble();
|
|
|
- if (param.name == "Aperture Size") apertureSize = param.value.toInt();
|
|
|
- if (param.name == "L2 Gradient") l2gradient = param.value.toBool();
|
|
|
- }
|
|
|
-
|
|
|
- cv::Mat gray;
|
|
|
- if (image.channels() == 3) {
|
|
|
- cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
|
|
|
- } else {
|
|
|
- gray = image;
|
|
|
- }
|
|
|
-
|
|
|
- cv::Canny(gray, image, threshold1, threshold2, apertureSize, l2gradient);
|
|
|
-
|
|
|
- // Store output parameters
|
|
|
- runtimeParams.outimage = image.clone(); // Store output image
|
|
|
-
|
|
|
- // Count edges (simple implementation)
|
|
|
- runtimeParams.edgeCount = cv::countNonZero(image);
|
|
|
-}
|
|
|
-
|
|
|
-AlgorithmMeta CannyEdge::getParams() {
|
|
|
- return cannyMeta;
|
|
|
-}
|
|
|
-
|
|
|
-void CannyEdge::setParams(const AlgorithmMeta& params) {
|
|
|
- cannyMeta = params;
|
|
|
-}
|
|
|
-
|
|
|
-Thresholding::Thresholding() {
|
|
|
- AlgoritName = "Thresholding";
|
|
|
- Thresh = 127;
|
|
|
- MaxVal = 255;
|
|
|
- Type = 0;
|
|
|
-}
|
|
|
-
|
|
|
-void Thresholding::process(cv::Mat image) {
|
|
|
- // Store input parameters
|
|
|
- runtimeParams.inputimage = image.clone(); // Store input image
|
|
|
-
|
|
|
-
|
|
|
- // Convert to grayscale image
|
|
|
- cv::Mat gray;
|
|
|
- if (image.channels() == 3) {
|
|
|
- cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
|
|
|
- } else {
|
|
|
- gray = image;
|
|
|
- }
|
|
|
-
|
|
|
- // Execute thresholding
|
|
|
- cv::threshold(gray, image, Thresh, MaxVal, Type);
|
|
|
- // Count white pixels
|
|
|
- runtimeParams.whitePixelCount = cv::countNonZero(image);
|
|
|
-
|
|
|
- // Store output parameters
|
|
|
- runtimeParams.outimage = image.clone(); // Store output image
|
|
|
-}
|
|
|
-
|
|
|
-AlgorithmMeta Thresholding::getParams() {
|
|
|
- AlgorithmMeta p;
|
|
|
- p.name = QString::fromStdString(AlgoritName);
|
|
|
- p.addParam("Threshold", "int", Thresh, 0, 255);
|
|
|
- p.addParam("Max Value", "int", MaxVal, 0, 255);
|
|
|
- p.addParam("Threshold Type", "int", Type, 0, 4);
|
|
|
- return p;
|
|
|
-}
|
|
|
-
|
|
|
-void Thresholding::setParams(const AlgorithmMeta& params) {
|
|
|
- AlgoritName = params.name.toStdString();
|
|
|
- for (auto& param : params.params) {
|
|
|
- if (param.name == "Threshold") Thresh = param.value.toInt();
|
|
|
- if (param.name == "Max Value") MaxVal = param.value.toInt();
|
|
|
- if (param.name == "Threshold Type") Type = param.value.toInt();
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-GaussianBlur::GaussianBlur() {
|
|
|
- AlgoritName = "Gaussian Blur";
|
|
|
- KernelSize = 5;
|
|
|
- SigmaX = 1.5;
|
|
|
- SigmaY = 0.0;
|
|
|
-}
|
|
|
-
|
|
|
-void GaussianBlur::process(cv::Mat image) {
|
|
|
- // Store input parameters
|
|
|
- runtimeParams.inputimage = image.clone(); // Store input image
|
|
|
-
|
|
|
- // Ensure kernel size is odd
|
|
|
- int ksize = KernelSize;
|
|
|
- if (ksize % 2 == 0) {
|
|
|
- ksize++;
|
|
|
- }
|
|
|
-
|
|
|
- // Execute Gaussian blur
|
|
|
- cv::GaussianBlur(image, image, cv::Size(ksize, ksize), SigmaX, SigmaY);
|
|
|
-
|
|
|
- // Store output parameters
|
|
|
- runtimeParams.outimage = image.clone(); // Store output image
|
|
|
-}
|
|
|
-
|
|
|
-AlgorithmMeta GaussianBlur::getParams() {
|
|
|
- AlgorithmMeta p;
|
|
|
- p.name = QString::fromStdString(AlgoritName);
|
|
|
- p.addParam("Kernel Size", "int", KernelSize, 1, 31);
|
|
|
- p.addParam("Sigma X", "double", SigmaX, 0.0, 10.0);
|
|
|
- p.addParam("Sigma Y", "double", SigmaY, 0.0, 10.0);
|
|
|
- return p;
|
|
|
-}
|
|
|
-
|
|
|
-void GaussianBlur::setParams(const AlgorithmMeta& params) {
|
|
|
- AlgoritName = params.name.toStdString();
|
|
|
- for (auto& param : params.params) {
|
|
|
- if (param.name == "Kernel Size") KernelSize = param.value.toInt();
|
|
|
- if (param.name == "Sigma X") SigmaX = param.value.toDouble();
|
|
|
- if (param.name == "Sigma Y") SigmaY = param.value.toDouble();
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-MedianBlur::MedianBlur() {
|
|
|
- AlgoritName = "Median Blur";
|
|
|
- KernelSize = 5;
|
|
|
-}
|
|
|
-
|
|
|
-void MedianBlur::process(cv::Mat image) {
|
|
|
- // Store input parameters
|
|
|
- runtimeParams.inputimage = image.clone(); // Store input image
|
|
|
-
|
|
|
- // Ensure kernel size is odd
|
|
|
- int ksize = KernelSize;
|
|
|
- if (ksize % 2 == 0) {
|
|
|
- ksize++;
|
|
|
- }
|
|
|
-
|
|
|
- // Execute median blur
|
|
|
- cv::medianBlur(image, image, ksize);
|
|
|
-
|
|
|
- // Store output parameters
|
|
|
- runtimeParams.outimage = image.clone(); // Store output image
|
|
|
-}
|
|
|
-
|
|
|
-AlgorithmMeta MedianBlur::getParams() {
|
|
|
- AlgorithmMeta p;
|
|
|
- p.name = QString::fromStdString(AlgoritName);
|
|
|
- p.addParam("Kernel Size", "int", KernelSize, 1, 31);
|
|
|
- return p;
|
|
|
-}
|
|
|
-
|
|
|
-void MedianBlur::setParams(const AlgorithmMeta& params) {
|
|
|
- AlgoritName = params.name.toStdString();
|
|
|
- for (auto& param : params.params) {
|
|
|
- if (param.name == "Kernel Size") KernelSize = param.value.toInt();
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-Dilate::Dilate() {
|
|
|
- AlgoritName = "Dilate";
|
|
|
- KernerSize = 3;
|
|
|
- Iterations = 1;
|
|
|
-}
|
|
|
-
|
|
|
-void Dilate::process(cv::Mat image) {
|
|
|
- // Store input parameters
|
|
|
- runtimeParams.inputimage = image.clone(); // Store input image
|
|
|
-
|
|
|
- // Create structuring element
|
|
|
- cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(KernerSize, KernerSize));
|
|
|
-
|
|
|
- // Execute dilation
|
|
|
- cv::dilate(image, image, kernel, cv::Point(-1, -1), Iterations);
|
|
|
-
|
|
|
- // Store output parameters
|
|
|
- runtimeParams.outimage = image.clone(); // Store output image
|
|
|
-}
|
|
|
-
|
|
|
-AlgorithmMeta Dilate::getParams() {
|
|
|
- AlgorithmMeta p;
|
|
|
- p.name = QString::fromStdString(AlgoritName);
|
|
|
- p.addParam("Kernel Size", "int", KernerSize, 0, 100);
|
|
|
- p.addParam("Iterations", "int", Iterations, 0, 100);
|
|
|
- return p;
|
|
|
-}
|
|
|
-
|
|
|
-void Dilate::setParams(const AlgorithmMeta& params) {
|
|
|
- AlgoritName = params.name.toStdString();
|
|
|
- for (auto& param : params.params) {
|
|
|
- if (param.name == "Kernel Size") KernerSize = param.value.toInt();
|
|
|
- if (param.name == "Iterations") Iterations = param.value.toInt();
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-Erode::Erode() {
|
|
|
- AlgoritName = "Erode";
|
|
|
- KernerSize = 3;
|
|
|
- Iterations = 1;
|
|
|
-}
|
|
|
-
|
|
|
-void Erode::process(cv::Mat image) {
|
|
|
- // Store input parameters
|
|
|
- runtimeParams.inputimage = image.clone(); // Store input image
|
|
|
-
|
|
|
- // Create structuring element
|
|
|
- cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(KernerSize, KernerSize));
|
|
|
-
|
|
|
- // Execute erosion
|
|
|
- cv::erode(image, image, kernel, cv::Point(-1, -1), Iterations);
|
|
|
-
|
|
|
- // Store output parameters
|
|
|
- runtimeParams.outimage = image.clone(); // Store output image
|
|
|
-}
|
|
|
-
|
|
|
-AlgorithmMeta Erode::getParams() {
|
|
|
- AlgorithmMeta p;
|
|
|
- p.name = QString::fromStdString(AlgoritName);
|
|
|
- p.addParam("Kernel Size", "int", KernerSize, 0, 100);
|
|
|
- p.addParam("Iterations", "int", Iterations, 0, 100);
|
|
|
- return p;
|
|
|
-}
|
|
|
-
|
|
|
-void Erode::setParams(const AlgorithmMeta& params) {
|
|
|
- AlgoritName = params.name.toStdString();
|
|
|
- for (auto& param : params.params) {
|
|
|
- if (param.name == "Kernel Size") KernerSize = param.value.toInt();
|
|
|
- if (param.name == "Iterations") Iterations = param.value.toInt();
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-Grayscale::Grayscale() {
|
|
|
- AlgoritName = "Grayscale";
|
|
|
-}
|
|
|
-
|
|
|
-void Grayscale::process(cv::Mat image) {
|
|
|
- // Store input parameters
|
|
|
- runtimeParams.inputimage = image.clone(); // Store input image
|
|
|
-
|
|
|
- // Execute grayscale conversion
|
|
|
- if (image.channels() == 3) {
|
|
|
- cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);
|
|
|
- }
|
|
|
-
|
|
|
- // Store output parameters
|
|
|
- runtimeParams.outimage = image.clone(); // Store output image
|
|
|
-}
|
|
|
-
|
|
|
-AlgorithmMeta Grayscale::getParams() {
|
|
|
- AlgorithmMeta p;
|
|
|
- p.name = QString::fromStdString(AlgoritName);
|
|
|
- return p;
|
|
|
-}
|
|
|
-
|
|
|
-void Grayscale::setParams(const AlgorithmMeta& params) {
|
|
|
- AlgoritName = params.name.toStdString();
|
|
|
-}
|
|
|
-
|
|
|
-HistogramEqualization::HistogramEqualization() {
|
|
|
- AlgoritName = "Histogram Equalization";
|
|
|
-}
|
|
|
-
|
|
|
-void HistogramEqualization::process(cv::Mat image) {
|
|
|
- // Store input parameters
|
|
|
- runtimeParams.inputimage = image.clone(); // Store input image
|
|
|
-
|
|
|
- // Convert to grayscale image
|
|
|
- cv::Mat gray;
|
|
|
- if (image.channels() == 3) {
|
|
|
- cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
|
|
|
- } else {
|
|
|
- gray = image;
|
|
|
- }
|
|
|
-
|
|
|
- // Execute histogram equalization
|
|
|
- cv::equalizeHist(gray, image);
|
|
|
-
|
|
|
- // Store output parameters
|
|
|
- runtimeParams.outimage = image.clone(); // Store output image
|
|
|
-}
|
|
|
-
|
|
|
-AlgorithmMeta HistogramEqualization::getParams() {
|
|
|
- AlgorithmMeta p;
|
|
|
- p.name = QString::fromStdString(AlgoritName);
|
|
|
- return p;
|
|
|
-}
|
|
|
-
|
|
|
-void HistogramEqualization::setParams(const AlgorithmMeta& params) {
|
|
|
- AlgoritName = params.name.toStdString();
|
|
|
-}
|
|
|
-
|
|
|
-FindContours::FindContours() {
|
|
|
- AlgoritName = "Find Contours";
|
|
|
- Mode = 3; // RETR_TREE
|
|
|
- Method = 2; // CHAIN_APPROX_SIMPLE
|
|
|
-}
|
|
|
-
|
|
|
-void FindContours::process(cv::Mat image) {
|
|
|
- // Store input parameters
|
|
|
- runtimeParams.inputimage = image.clone(); // Store input image
|
|
|
-
|
|
|
-
|
|
|
- // Convert to grayscale image
|
|
|
- cv::Mat gray;
|
|
|
- if (image.channels() == 3) {
|
|
|
- cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
|
|
|
- } else {
|
|
|
- gray = image;
|
|
|
- }
|
|
|
-
|
|
|
- // Binarization
|
|
|
- cv::Mat binary;
|
|
|
- cv::threshold(gray, binary, 127, 255, cv::THRESH_BINARY);
|
|
|
-
|
|
|
- // Find contours
|
|
|
- std::vector<std::vector<cv::Point>> contours;
|
|
|
- std::vector<cv::Vec4i> hierarchy;
|
|
|
- cv::findContours(binary, contours, hierarchy, Mode, Method);
|
|
|
-
|
|
|
- // Draw contours
|
|
|
- cv::Mat result = cv::Mat::zeros(image.size(), CV_8UC3);
|
|
|
- cv::drawContours(result, contours, -1, cv::Scalar(0, 255, 0), 2);
|
|
|
-
|
|
|
- // Convert result back to grayscale if needed
|
|
|
- if (image.channels() == 1) {
|
|
|
- cv::cvtColor(result, image, cv::COLOR_BGR2GRAY);
|
|
|
- } else {
|
|
|
- image = result;
|
|
|
- }
|
|
|
-
|
|
|
- runtimeParams.contourCount = static_cast<int>(contours.size());
|
|
|
-
|
|
|
- // Store output parameters
|
|
|
- runtimeParams.outimage = image.clone(); // Store output image
|
|
|
-}
|
|
|
-
|
|
|
-AlgorithmMeta FindContours::getParams() {
|
|
|
- AlgorithmMeta p;
|
|
|
- p.name = QString::fromStdString(AlgoritName);
|
|
|
- p.addParam("Retrieval Mode", "int", Mode, 0, 4);
|
|
|
- p.addParam("Approx Method", "int", Method, 0, 3);
|
|
|
- return p;
|
|
|
-}
|
|
|
-
|
|
|
-void FindContours::setParams(const AlgorithmMeta& params) {
|
|
|
- AlgoritName = params.name.toStdString();
|
|
|
- for (auto& param : params.params) {
|
|
|
- if (param.name == "Retrieval Mode") Mode = param.value.toInt();
|
|
|
- if (param.name == "Approx Method") Method = param.value.toInt();
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-
|