From c1f921d59fd9c6d2e79e2306a155e9b8512c865c Mon Sep 17 00:00:00 2001 From: Jan Philipp Timme Date: Fri, 13 Nov 2015 15:08:51 +0100 Subject: [PATCH] [TASK] Decouple original and working copy, add reset button. --- imageviewer-qt4.cpp | 66 ++++++++++++++++++++++++++++++++------------- imageviewer-qt4.h | 3 ++- 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/imageviewer-qt4.cpp b/imageviewer-qt4.cpp index 5046957..b6ee12f 100644 --- a/imageviewer-qt4.cpp +++ b/imageviewer-qt4.cpp @@ -74,7 +74,6 @@ void ImageViewer::initializeImage() { /** * In case it is needed, convert the loaded image into grayscale. - * This is the only method modifying the original image! * * @brief ImageViewer::convertToMonochrome */ @@ -82,8 +81,7 @@ void ImageViewer::convertToMonochrome() { if(original->getImage() != NULL) { logFile << "Converting image to monochrome..."; renewLogging(); - - original->convertToMonochrome(); + working_copy->convertToMonochrome(); updateImageDisplay(); @@ -92,6 +90,25 @@ void ImageViewer::convertToMonochrome() { } } +/** + * No big performance, but simple. + * Restore the working copy based on the existing original image. + * + * @brief ImageViewer::resetWorkingCopy + */ +void ImageViewer::resetWorkingCopy() { + logFile << "Resetting working copy ..."; + renewLogging(); + for(int x=0; xgetImage()->width(); x++) { + for(int y=0; ygetImage()->height(); y++) { + working_copy->getImage()->setPixel(x, y, original->getImage()->pixel(x, y)); + } + } + updateImageDisplay(); + logFile << "done." << std::endl; + renewLogging(); +} + /** * Draws a simple, black line. * @brief ImageViewer::drawBlackLine @@ -237,24 +254,31 @@ void ImageViewer::adjustContrast(int c) { * @brief ImageViewer::robustAutomaticContrastAdaption */ void ImageViewer::robustAutomaticContrastAdaption(void) { - int percentile = contrast_percentile_slider->value(); - logFile << "Doing automatic robust contrast adaption (" << percentile << "%), hold tight... " << std::endl; + double* histogramm = original->getRelativeIntensityHistogramm(); + double limit = contrast_percentile_slider->value() / 100.0; + logFile << "Doing automatic robust contrast adaption (" << limit << "), hold tight ..." << std::endl; renewLogging(); // Determine upper and lower "borders" + double cursor; int lower_border = -1; - int upper_border = -1; - double limit = percentile / 100.0; - double cursor = 0.0; - double* grayscale_relative_histogramm = original->getRelativeIntensityHistogramm(); + int upper_border = -1; + + cursor = 0.0; for(int i=0; i<256; i++) { - cursor += grayscale_relative_histogramm[i]; - if(cursor >= limit && lower_border == -1) { - lower_border = i-1; + cursor += histogramm[i]; + if(cursor > limit) { + lower_border = i-1; // get last value before limit overflow if(lower_border < 0) lower_border = 0; + break; } - if(cursor >= 1-limit && upper_border == -1) { - upper_border = i; + } + + cursor = 0.0; + for(int i=255; i>-1; i--) { + cursor += histogramm[i]; + if(cursor > limit) { + upper_border = i+1; // get last value before limit overflow if(upper_border > 255) upper_border = 255; break; } @@ -292,7 +316,7 @@ void ImageViewer::robustAutomaticContrastAdaption(void) { * * GUI elements related to the tasks are set up here. * -**********************contrast_percentile_slider*******************************************************************/ +*****************************************************************************************/ void ImageViewer::generateControlPanels() { // Tab for first task @@ -304,6 +328,10 @@ void ImageViewer::generateControlPanels() { monochrome->setText("Convert to monochrome"); QObject::connect(monochrome, SIGNAL(clicked()), this, SLOT (convertToMonochrome())); + reset_working_copy = new QPushButton(); + reset_working_copy->setText("Reset working copy"); + QObject::connect(reset_working_copy, SIGNAL(clicked()), this, SLOT (resetWorkingCopy())); + draw_black_line = new QPushButton(); draw_black_line->setText("Draw a black line"); QObject::connect(draw_black_line, SIGNAL(clicked()), this, SLOT (drawBlackLine())); @@ -321,7 +349,8 @@ void ImageViewer::generateControlPanels() { line_slider->setMaximum(150); line_slider->setValue(3); //QObject::connect(lineSlider, SIGNAL(valueChanged(int)), this, SLOT (drawRainbowCross())); - + + task_tab1->addWidget(reset_working_copy); task_tab1->addWidget(monochrome); task_tab1->addWidget(new QLabel("Let's draw something!")); task_tab1->addWidget(draw_black_line); @@ -332,7 +361,7 @@ void ImageViewer::generateControlPanels() { task_tab1->addWidget(new QLabel("Sets the width of the cross.")); tabWidget->addTab(task_tab_widget1, "Task #1"); - + //Tab for second task task_tab_widget2 = new QWidget(); @@ -341,7 +370,7 @@ void ImageViewer::generateControlPanels() { histogramm_label = new QLabel(); histogramm_label->setBackgroundRole(QPalette::Base); - histogramm_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + histogramm_label->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); histogramm_label->setScaledContents(false); stats = new QLabel(); @@ -379,6 +408,7 @@ void ImageViewer::generateControlPanels() { task_tab2->addWidget(brightness_slider); task_tab2->addWidget(new QLabel("Contrast")); task_tab2->addWidget(contrast_slider); + task_tab2->addWidget(new QLabel("Automatic Contrast Percentile")); task_tab2->addWidget(contrast_percentile_slider); task_tab2->addWidget(automatic_robust_contrast); diff --git a/imageviewer-qt4.h b/imageviewer-qt4.h index 1f79d63..48df285 100644 --- a/imageviewer-qt4.h +++ b/imageviewer-qt4.h @@ -79,7 +79,7 @@ class ImageViewer : public QMainWindow { QPushButton* draw_rainbow_cross; QPushButton* diagonal_cross; QPushButton* monochrome; - + QPushButton* reset_working_copy; QSlider* line_slider; @@ -114,6 +114,7 @@ class ImageViewer : public QMainWindow { void adjustBrightness(int b); void adjustContrast(int c); void convertToMonochrome(); + void resetWorkingCopy(); void robustAutomaticContrastAdaption(); void open();