diff --git a/canny_edge_machine.cpp b/canny_edge_machine.cpp index 2a23157..d9eaa3c 100644 --- a/canny_edge_machine.cpp +++ b/canny_edge_machine.cpp @@ -290,6 +290,22 @@ class CannyEdgeMachine { this->showEdges(); }; + void doFirstStep(void) { + this->reset(); + this->doGaussBlur(); // uses filter_size, filter_sigma + this->doGradiants(); + this->doGradiantMagnitude(); + }; + + void doSecondStep(void) { + this->filterLocalMaxima(); // uses t_low only + }; + + void doThirdStep(void) { + this->workLocalMaxima(); // uses t_low & t_high + this->showEdges(); + }; + }; #endif diff --git a/imageviewer-qt4.cpp b/imageviewer-qt4.cpp index 61320b1..a5c7f25 100644 --- a/imageviewer-qt4.cpp +++ b/imageviewer-qt4.cpp @@ -48,6 +48,7 @@ ImageViewer::ImageViewer() { original = NULL; working_copy = NULL; histogramm_reference = NULL; + canny_edge_machine = NULL; startLogging(); generateMainGui(); renewLogging(); @@ -649,16 +650,69 @@ void ImageViewer::applyBasicFilterWithOverflowHandling() { * @brief ImageViewer::runCannyEdge */ void ImageViewer::runCannyEdge(void) { - CannyEdgeMachine cem = CannyEdgeMachine(original, working_copy); int filter_size = gauss_filter_size->value(); double filter_sigma = gauss_filter_sigma->value(); double t_low = t_low_spinbox->value(); double t_high = t_high_spinbox->value(); logFile << "Canny-Edge using N*N filter size: " << filter_size << ", filter sigma: " << filter_sigma << ", and thresholds: " << t_low << ", " << t_high << std::endl; renewLogging(); - cem.setGaussFilterParams(filter_size, filter_sigma); - cem.setThresholdValues(t_low, t_high); - cem.work(); + canny_edge_machine->setGaussFilterParams(filter_size, filter_sigma); + canny_edge_machine->setThresholdValues(t_low, t_high); + canny_edge_machine->work(); + updateImageDisplay(); +} + +/** + * Does the first step of canny edge. + * + * @brief ImageViewer::runCannyEdgeFirstStep + */ +void ImageViewer::runCannyEdgeFirstStep(void) { + int filter_size = gauss_filter_size->value(); + double filter_sigma = gauss_filter_sigma->value(); + double t_low = t_low_spinbox->value(); + double t_high = t_high_spinbox->value(); + logFile << "[Step 1] Canny-Edge using N*N filter size: " << filter_size << ", filter sigma: " << filter_sigma << ", and thresholds: " << t_low << ", " << t_high << std::endl; + renewLogging(); + canny_edge_machine->setGaussFilterParams(filter_size, filter_sigma); + canny_edge_machine->setThresholdValues(t_low, t_high); + canny_edge_machine->doFirstStep(); + updateImageDisplay(); +} + +/** + * Does the second step of canny edge. + * + * @brief ImageViewer::runCannyEdgeSecondStep + */ +void ImageViewer::runCannyEdgeSecondStep(void) { + int filter_size = gauss_filter_size->value(); + double filter_sigma = gauss_filter_sigma->value(); + double t_low = t_low_spinbox->value(); + double t_high = t_high_spinbox->value(); + logFile << "[Step 2] Canny-Edge using N*N filter size: " << filter_size << ", filter sigma: " << filter_sigma << ", and thresholds: " << t_low << ", " << t_high << std::endl; + renewLogging(); + canny_edge_machine->setGaussFilterParams(filter_size, filter_sigma); + canny_edge_machine->setThresholdValues(t_low, t_high); + canny_edge_machine->doSecondStep(); + updateImageDisplay(); +} + +/** + * Does the third step of canny edge. + * + * @brief ImageViewer::runCannyEdgeThirdStep + */ +void ImageViewer::runCannyEdgeThirdStep(void) { + int filter_size = gauss_filter_size->value(); + double filter_sigma = gauss_filter_sigma->value(); + double t_low = t_low_spinbox->value(); + double t_high = t_high_spinbox->value(); + logFile << "[Step 3] Canny-Edge using N*N filter size: " << filter_size << ", filter sigma: " << filter_sigma << ", and thresholds: " << t_low << ", " << t_high << std::endl; + renewLogging(); + canny_edge_machine->setGaussFilterParams(filter_size, filter_sigma); + canny_edge_machine->setThresholdValues(t_low, t_high); + canny_edge_machine->doThirdStep(); updateImageDisplay(); } /**************************************************************************************** @@ -922,9 +976,18 @@ void ImageViewer::generateControlPanels() { task_tab5_scrolllayout->setSizeConstraint(QLayout::SetMaximumSize); task_tab5_scrollwidget->setLayout(task_tab5_scrolllayout); - run_canny_edge = new QPushButton("Run canny edge algorithm!"); + run_canny_edge = new QPushButton("Run whole canny edge algorithm!"); QObject::connect(run_canny_edge, SIGNAL(clicked()), this, SLOT(runCannyEdge())); + run_canny_edge_first_step = new QPushButton("Do gaussian blur and do gradiants"); + QObject::connect(run_canny_edge_first_step, SIGNAL(clicked()), this, SLOT(runCannyEdgeFirstStep())); + + run_canny_edge_second_step = new QPushButton("Filter local maxima"); + QObject::connect(run_canny_edge_second_step, SIGNAL(clicked()), this, SLOT(runCannyEdgeSecondStep())); + + run_canny_edge_third_step = new QPushButton("Work local maxima, show result"); + QObject::connect(run_canny_edge_third_step, SIGNAL(clicked()), this, SLOT(runCannyEdgeThirdStep())); + gauss_filter_size = new QDoubleSpinBox(); gauss_filter_size->setDecimals(0); gauss_filter_size->setMinimum(3); @@ -946,10 +1009,13 @@ void ImageViewer::generateControlPanels() { task_tab5_scrolllayout->addWidget(gauss_filter_size); task_tab5_scrolllayout->addWidget(new QLabel("Gauss filter sigma")); task_tab5_scrolllayout->addWidget(gauss_filter_sigma); + task_tab5_scrolllayout->addWidget(run_canny_edge_first_step); task_tab5_scrolllayout->addWidget(new QLabel("Low threshold value")); task_tab5_scrolllayout->addWidget(t_low_spinbox); + task_tab5_scrolllayout->addWidget(run_canny_edge_second_step); task_tab5_scrolllayout->addWidget(new QLabel("High threshold value")); task_tab5_scrolllayout->addWidget(t_high_spinbox); + task_tab5_scrolllayout->addWidget(run_canny_edge_third_step); task_tab5_scrolllayout->addWidget(run_canny_edge); tabWidget->addTab(task_tab5_widget, "Task #5"); @@ -1057,6 +1123,10 @@ void ImageViewer::open() { delete original; original = NULL; } + if(canny_edge_machine != NULL) { + delete canny_edge_machine; + canny_edge_machine = NULL; + } QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), QDir::currentPath()); if(!fileName.isEmpty()) { working_copy = new LazyImage(new QImage(fileName)); @@ -1065,6 +1135,7 @@ void ImageViewer::open() { QMessageBox::information(this, tr("Image Viewer"), tr("Cannot load %1.").arg(fileName)); return; } + canny_edge_machine = new CannyEdgeMachine(original, working_copy); scaleFactor = 1.0; updateImageDisplay(); printAct->setEnabled(true); diff --git a/imageviewer-qt4.h b/imageviewer-qt4.h index f7c90d6..921256c 100644 --- a/imageviewer-qt4.h +++ b/imageviewer-qt4.h @@ -152,11 +152,15 @@ class ImageViewer : public QMainWindow { QDoubleSpinBox* t_low_spinbox; QDoubleSpinBox* t_high_spinbox; QPushButton* run_canny_edge; + QPushButton* run_canny_edge_first_step; + QPushButton* run_canny_edge_second_step; + QPushButton* run_canny_edge_third_step; // "My" space for storing data/results LazyImage* original; LazyImage* working_copy; LazyImage* histogramm_reference; + CannyEdgeMachine* canny_edge_machine; private slots: // Custom slots @@ -177,6 +181,9 @@ class ImageViewer : public QMainWindow { void applyBasicFilter(); void applyBasicFilterWithOverflowHandling(); void runCannyEdge(void); + void runCannyEdgeFirstStep(void); + void runCannyEdgeSecondStep(void); + void runCannyEdgeThirdStep(void); void open(); void openReference();