[TASK] Decouple original and working copy, add reset button.
This commit is contained in:
parent
a6854a9625
commit
c1f921d59f
|
@ -74,7 +74,6 @@ void ImageViewer::initializeImage() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* In case it is needed, convert the loaded image into grayscale.
|
* In case it is needed, convert the loaded image into grayscale.
|
||||||
* This is the only method modifying the original image!
|
|
||||||
*
|
*
|
||||||
* @brief ImageViewer::convertToMonochrome
|
* @brief ImageViewer::convertToMonochrome
|
||||||
*/
|
*/
|
||||||
|
@ -83,7 +82,6 @@ void ImageViewer::convertToMonochrome() {
|
||||||
logFile << "Converting image to monochrome...";
|
logFile << "Converting image to monochrome...";
|
||||||
renewLogging();
|
renewLogging();
|
||||||
|
|
||||||
original->convertToMonochrome();
|
|
||||||
working_copy->convertToMonochrome();
|
working_copy->convertToMonochrome();
|
||||||
|
|
||||||
updateImageDisplay();
|
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; x<original->getImage()->width(); x++) {
|
||||||
|
for(int y=0; y<original->getImage()->height(); y++) {
|
||||||
|
working_copy->getImage()->setPixel(x, y, original->getImage()->pixel(x, y));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateImageDisplay();
|
||||||
|
logFile << "done." << std::endl;
|
||||||
|
renewLogging();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draws a simple, black line.
|
* Draws a simple, black line.
|
||||||
* @brief ImageViewer::drawBlackLine
|
* @brief ImageViewer::drawBlackLine
|
||||||
|
@ -237,24 +254,31 @@ void ImageViewer::adjustContrast(int c) {
|
||||||
* @brief ImageViewer::robustAutomaticContrastAdaption
|
* @brief ImageViewer::robustAutomaticContrastAdaption
|
||||||
*/
|
*/
|
||||||
void ImageViewer::robustAutomaticContrastAdaption(void) {
|
void ImageViewer::robustAutomaticContrastAdaption(void) {
|
||||||
int percentile = contrast_percentile_slider->value();
|
double* histogramm = original->getRelativeIntensityHistogramm();
|
||||||
logFile << "Doing automatic robust contrast adaption (" << percentile << "%), hold tight... " << std::endl;
|
double limit = contrast_percentile_slider->value() / 100.0;
|
||||||
|
logFile << "Doing automatic robust contrast adaption (" << limit << "), hold tight ..." << std::endl;
|
||||||
renewLogging();
|
renewLogging();
|
||||||
|
|
||||||
// Determine upper and lower "borders"
|
// Determine upper and lower "borders"
|
||||||
|
double cursor;
|
||||||
int lower_border = -1;
|
int lower_border = -1;
|
||||||
int upper_border = -1;
|
int upper_border = -1;
|
||||||
double limit = percentile / 100.0;
|
|
||||||
double cursor = 0.0;
|
cursor = 0.0;
|
||||||
double* grayscale_relative_histogramm = original->getRelativeIntensityHistogramm();
|
|
||||||
for(int i=0; i<256; i++) {
|
for(int i=0; i<256; i++) {
|
||||||
cursor += grayscale_relative_histogramm[i];
|
cursor += histogramm[i];
|
||||||
if(cursor >= limit && lower_border == -1) {
|
if(cursor > limit) {
|
||||||
lower_border = i-1;
|
lower_border = i-1; // get last value before limit overflow
|
||||||
if(lower_border < 0) lower_border = 0;
|
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;
|
if(upper_border > 255) upper_border = 255;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -292,7 +316,7 @@ void ImageViewer::robustAutomaticContrastAdaption(void) {
|
||||||
*
|
*
|
||||||
* GUI elements related to the tasks are set up here.
|
* GUI elements related to the tasks are set up here.
|
||||||
*
|
*
|
||||||
**********************contrast_percentile_slider*******************************************************************/
|
*****************************************************************************************/
|
||||||
|
|
||||||
void ImageViewer::generateControlPanels() {
|
void ImageViewer::generateControlPanels() {
|
||||||
// Tab for first task
|
// Tab for first task
|
||||||
|
@ -304,6 +328,10 @@ void ImageViewer::generateControlPanels() {
|
||||||
monochrome->setText("Convert to monochrome");
|
monochrome->setText("Convert to monochrome");
|
||||||
QObject::connect(monochrome, SIGNAL(clicked()), this, SLOT (convertToMonochrome()));
|
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 = new QPushButton();
|
||||||
draw_black_line->setText("Draw a black line");
|
draw_black_line->setText("Draw a black line");
|
||||||
QObject::connect(draw_black_line, SIGNAL(clicked()), this, SLOT (drawBlackLine()));
|
QObject::connect(draw_black_line, SIGNAL(clicked()), this, SLOT (drawBlackLine()));
|
||||||
|
@ -322,6 +350,7 @@ void ImageViewer::generateControlPanels() {
|
||||||
line_slider->setValue(3);
|
line_slider->setValue(3);
|
||||||
//QObject::connect(lineSlider, SIGNAL(valueChanged(int)), this, SLOT (drawRainbowCross()));
|
//QObject::connect(lineSlider, SIGNAL(valueChanged(int)), this, SLOT (drawRainbowCross()));
|
||||||
|
|
||||||
|
task_tab1->addWidget(reset_working_copy);
|
||||||
task_tab1->addWidget(monochrome);
|
task_tab1->addWidget(monochrome);
|
||||||
task_tab1->addWidget(new QLabel("Let's draw something!"));
|
task_tab1->addWidget(new QLabel("Let's draw something!"));
|
||||||
task_tab1->addWidget(draw_black_line);
|
task_tab1->addWidget(draw_black_line);
|
||||||
|
@ -341,7 +370,7 @@ void ImageViewer::generateControlPanels() {
|
||||||
|
|
||||||
histogramm_label = new QLabel();
|
histogramm_label = new QLabel();
|
||||||
histogramm_label->setBackgroundRole(QPalette::Base);
|
histogramm_label->setBackgroundRole(QPalette::Base);
|
||||||
histogramm_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
histogramm_label->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
|
||||||
histogramm_label->setScaledContents(false);
|
histogramm_label->setScaledContents(false);
|
||||||
|
|
||||||
stats = new QLabel();
|
stats = new QLabel();
|
||||||
|
@ -379,6 +408,7 @@ void ImageViewer::generateControlPanels() {
|
||||||
task_tab2->addWidget(brightness_slider);
|
task_tab2->addWidget(brightness_slider);
|
||||||
task_tab2->addWidget(new QLabel("Contrast"));
|
task_tab2->addWidget(new QLabel("Contrast"));
|
||||||
task_tab2->addWidget(contrast_slider);
|
task_tab2->addWidget(contrast_slider);
|
||||||
|
task_tab2->addWidget(new QLabel("Automatic Contrast Percentile"));
|
||||||
task_tab2->addWidget(contrast_percentile_slider);
|
task_tab2->addWidget(contrast_percentile_slider);
|
||||||
task_tab2->addWidget(automatic_robust_contrast);
|
task_tab2->addWidget(automatic_robust_contrast);
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ class ImageViewer : public QMainWindow {
|
||||||
QPushButton* draw_rainbow_cross;
|
QPushButton* draw_rainbow_cross;
|
||||||
QPushButton* diagonal_cross;
|
QPushButton* diagonal_cross;
|
||||||
QPushButton* monochrome;
|
QPushButton* monochrome;
|
||||||
|
QPushButton* reset_working_copy;
|
||||||
|
|
||||||
QSlider* line_slider;
|
QSlider* line_slider;
|
||||||
|
|
||||||
|
@ -114,6 +114,7 @@ class ImageViewer : public QMainWindow {
|
||||||
void adjustBrightness(int b);
|
void adjustBrightness(int b);
|
||||||
void adjustContrast(int c);
|
void adjustContrast(int c);
|
||||||
void convertToMonochrome();
|
void convertToMonochrome();
|
||||||
|
void resetWorkingCopy();
|
||||||
void robustAutomaticContrastAdaption();
|
void robustAutomaticContrastAdaption();
|
||||||
|
|
||||||
void open();
|
void open();
|
||||||
|
|
Loading…
Reference in New Issue