[TASK] Implement Task#2 Sub 1.

This commit is contained in:
Jan Philipp Timme 2015-10-30 13:52:23 +01:00
parent d8aa33b45d
commit 1d09fcdcc7
2 changed files with 111 additions and 27 deletions

View File

@ -142,6 +142,78 @@ void ImageViewer::acidTrippin() {
} }
} }
/**
* Analyze the image, get average luminance
* Also fill grayscale_absolute_histogramm
* @brief ImageViewer::analyzeImage
*/
void ImageViewer::analyzeImage() {
if(image!=NULL) {
//Zero existing histogramm data first
for(int i=0; i<256; i++) {
grayscale_absolute_histogramm[i] = 0;
grayscale_relative_histogramm[i] = 0;
}
logFile << "Analyzing image ...";
renewLogging();
for(int x=0; x<image->width(); x++) {
for(int y=0; y<image->height(); y++) {
logFile << "(" << x << "," << y << "): ";
int r,g,b;
QColor color = QColor::fromRgb(image->pixel(x, y));
color.getRgb(&r,&g,&b);
logFile << "(" << r << "," << g << "," << b << ")";
int intensity = (int)(0.299*r+0.587*g+0.114*b);
logFile << "(" << intensity << ")";
grayscale_absolute_histogramm[intensity] += 1;
logFile << std::endl;
}
}
int pixels = image->width()*image->height();
for(int i=0; i<256; i++) {
grayscale_relative_histogramm[i] = ((1.0*grayscale_absolute_histogramm[i])/(1.0*pixels));
}
logFile << "done" << std::endl;
logFile << "Average intensity: " << getAverageIntensity() << std::endl;
logFile << "Intensity variance: " << getIntensityVariance() << std::endl;
renewLogging();
}
}
/**
* Use histogramm to retrieve the average intensity.
* @brief ImageViewer::getAverageIntensity
*/
int ImageViewer::getAverageIntensity() {
double sumIntensity = 0;
for(int i=0; i<256;i++) {
sumIntensity += (i*grayscale_relative_histogramm[i]);
}
return (int)sumIntensity;
}
/**
* Retrieve the intensity variance from the image.
* @brief ImageViewer::getVarianceIntensity
*/
int ImageViewer::getIntensityVariance() {
int average_intensity = getAverageIntensity();
int sumDifference = 0;
for(int x=0; x<image->width(); x++) {
for(int y=0; y<image->height(); y++) {
QColor color = QColor::fromRgb(image->pixel(x, y));
int r,g,b;
color.getRgb(&r,&g,&b);
int intensity = (int)(0.299*r+0.587*g+0.114*b);
int diff = std::abs(intensity - average_intensity);
sumDifference += diff;
}
}
return (int) (sumDifference/(image->width()*image->height()));
}
/**************************************************************************************** /****************************************************************************************
* *
@ -155,21 +227,21 @@ void ImageViewer::generateControlPanels() {
task_tab1 = new QVBoxLayout(); task_tab1 = new QVBoxLayout();
task_tab_widget1->setLayout(task_tab1); task_tab_widget1->setLayout(task_tab1);
button1 = new QPushButton(); task_tab1_button1 = new QPushButton();
button1->setText("Draw a black line"); task_tab1_button1->setText("Draw a black line");
QObject::connect(button1, SIGNAL(clicked()), this, SLOT (drawBlackLine())); QObject::connect(task_tab1_button1, SIGNAL(clicked()), this, SLOT (drawBlackLine()));
button2 = new QPushButton(); task_tab1_button2 = new QPushButton();
button2->setText("Draw a rainbow cross"); task_tab1_button2->setText("Draw a rainbow cross");
QObject::connect(button2, SIGNAL(clicked()), this, SLOT (drawRainbowCross())); QObject::connect(task_tab1_button2, SIGNAL(clicked()), this, SLOT (drawRainbowCross()));
button3 = new QPushButton(); task_tab1_button3 = new QPushButton();
button3->setText("Start the neverending acid trip!"); task_tab1_button3->setText("Start the neverending acid trip!");
QObject::connect(button3, SIGNAL(clicked()), this, SLOT (acidTrippin())); QObject::connect(task_tab1_button3, SIGNAL(clicked()), this, SLOT (acidTrippin()));
button4 = new QPushButton(); task_tab1_button4 = new QPushButton();
button4->setText("Draw a diagonal cross"); task_tab1_button4->setText("Draw a diagonal cross");
QObject::connect(button4, SIGNAL(clicked()), this, SLOT (drawDiagonalCross())); QObject::connect(task_tab1_button4, SIGNAL(clicked()), this, SLOT (drawDiagonalCross()));
lineSlider = new QSlider(Qt::Horizontal); lineSlider = new QSlider(Qt::Horizontal);
lineSlider->setMinimum(1); lineSlider->setMinimum(1);
@ -178,10 +250,10 @@ void ImageViewer::generateControlPanels() {
//QObject::connect(lineSlider, SIGNAL(valueChanged(int)), this, SLOT (drawRainbowCross())); //QObject::connect(lineSlider, SIGNAL(valueChanged(int)), this, SLOT (drawRainbowCross()));
task_tab1->addWidget(new QLabel("Let's draw something!")); task_tab1->addWidget(new QLabel("Let's draw something!"));
task_tab1->addWidget(button1); task_tab1->addWidget(task_tab1_button1);
task_tab1->addWidget(button2); task_tab1->addWidget(task_tab1_button2);
task_tab1->addWidget(button3); task_tab1->addWidget(task_tab1_button3);
task_tab1->addWidget(button4); task_tab1->addWidget(task_tab1_button4);
task_tab1->addWidget(new QLabel("This will not stop unless process is killed.")); task_tab1->addWidget(new QLabel("This will not stop unless process is killed."));
task_tab1->addWidget(lineSlider); task_tab1->addWidget(lineSlider);
task_tab1->addWidget(new QLabel("Sets the width of the cross.")); task_tab1->addWidget(new QLabel("Sets the width of the cross."));
@ -190,17 +262,21 @@ void ImageViewer::generateControlPanels() {
//Tab for second task //Tab for second task
task_tab2_button1 = new QPushButton();
task_tab2_button1->setText("Analyze image");
QObject::connect(task_tab2_button1, SIGNAL(clicked()), this, SLOT (analyzeImage()));
QLabel* task_tab2_stats = new QLabel();
task_tab_widget2 = new QWidget(); task_tab_widget2 = new QWidget();
task_tab2 = new QVBoxLayout(); task_tab2 = new QVBoxLayout();
task_tab_widget2->setLayout(task_tab2); task_tab_widget2->setLayout(task_tab2);
spinbox1 = new QSpinBox(tabWidget); task_tab2->addWidget(task_tab2_button1);
task_tab2->addWidget(task_tab2_stats);
task_tab2->addWidget(new QLabel("Here we put some more controls later."));
task_tab2->addWidget(spinbox1);
tabWidget->addTab(task_tab_widget2,"Task #2"); tabWidget->addTab(task_tab_widget2,"Task #2");
//tabWidget->show(); tabWidget->show();
} }

View File

@ -70,10 +70,10 @@ class ImageViewer : public QMainWindow {
QWidget* task_tab_widget1; QWidget* task_tab_widget1;
QVBoxLayout* task_tab1; QVBoxLayout* task_tab1;
QPushButton* button1; QPushButton* task_tab1_button1;
QPushButton* button2; QPushButton* task_tab1_button2;
QPushButton* button3; QPushButton* task_tab1_button3;
QPushButton* button4; QPushButton* task_tab1_button4;
QSlider* lineSlider; QSlider* lineSlider;
@ -81,7 +81,12 @@ class ImageViewer : public QMainWindow {
QWidget* task_tab_widget2; QWidget* task_tab_widget2;
QVBoxLayout* task_tab2; QVBoxLayout* task_tab2;
QSpinBox* spinbox1; QPushButton* task_tab2_button1;
QLabel* task_tab2_stats;
// "My" space for storing data/results
int grayscale_absolute_histogramm[256];
double grayscale_relative_histogramm[256];
private slots: private slots:
@ -90,6 +95,7 @@ class ImageViewer : public QMainWindow {
void drawRainbowCross(); void drawRainbowCross();
void drawDiagonalCross(); void drawDiagonalCross();
void acidTrippin(); void acidTrippin();
void analyzeImage();
void open(); void open();
void print(); void print();
@ -110,6 +116,8 @@ class ImageViewer : public QMainWindow {
private: private:
// Custom methods // Custom methods
void drawRainbowCross(int h); void drawRainbowCross(int h);
int getAverageIntensity();
int getIntensityVariance();
void generateControlPanels(); void generateControlPanels();
void startLogging(); void startLogging();