127 lines
4.7 KiB
C++
127 lines
4.7 KiB
C++
// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
#include "JFJochViewerImageROIStatistics.h"
|
|
|
|
#include <QVBoxLayout>
|
|
#include <QHBoxLayout>
|
|
|
|
JFJochViewerImageROIStatistics::JFJochViewerImageROIStatistics(QWidget *parent)
|
|
: QWidget(parent) {
|
|
QVBoxLayout *layout = new QVBoxLayout(this);
|
|
|
|
box_radio = new QRadioButton("Box", this);
|
|
box_settings = new JFJochViewerImageROIStatistics_Box(this);
|
|
QHBoxLayout *box_row = new QHBoxLayout();
|
|
box_row->addWidget(box_radio);
|
|
box_row->addWidget(box_settings);
|
|
layout->addLayout(box_row);
|
|
|
|
circle_radio = new QRadioButton("Circle", this);
|
|
circle_settings = new JFJochViewerImageROIStatistics_Circle(this);
|
|
QHBoxLayout *circle_row = new QHBoxLayout();
|
|
circle_row->addWidget(circle_radio);
|
|
circle_row->addWidget(circle_settings);
|
|
layout->addLayout(circle_row);
|
|
|
|
radio_group = new QButtonGroup(this);
|
|
radio_group->addButton(box_radio, 1);
|
|
radio_group->addButton(circle_radio, 2);
|
|
|
|
connect(box_radio, &QRadioButton::clicked, this, &JFJochViewerImageROIStatistics::BoxButtonClicked);
|
|
connect(circle_radio, &QRadioButton::clicked, this, &JFJochViewerImageROIStatistics::CircleButtonClicked);
|
|
connect(box_settings, &JFJochViewerImageROIStatistics_Box::Updated, this,
|
|
&JFJochViewerImageROIStatistics::BoxButtonClicked);
|
|
connect(circle_settings, &JFJochViewerImageROIStatistics_Circle::Updated, this,
|
|
&JFJochViewerImageROIStatistics::CircleButtonClicked);
|
|
|
|
circle_settings->Disable();
|
|
box_radio->setChecked(true);
|
|
|
|
QHBoxLayout *label_row = new QHBoxLayout();
|
|
|
|
roi_sum = new QLabel("", this);
|
|
label_row->addWidget(roi_sum);
|
|
roi_mean = new QLabel("", this);
|
|
label_row->addWidget(roi_mean);
|
|
roi_var = new QLabel("", this);
|
|
label_row->addWidget(roi_var);
|
|
roi_max = new QLabel("", this);
|
|
label_row->addWidget(roi_max);
|
|
roi_npixel = new QLabel("", this);
|
|
label_row->addWidget(roi_npixel);
|
|
layout->addLayout(label_row);
|
|
|
|
QPushButton *add_button = new QPushButton("Add ROI to user mask", this);
|
|
connect(add_button, &QPushButton::clicked, [this]() { emit AddROIToUserMask(); });
|
|
|
|
QPushButton *sub_button = new QPushButton("Subtract ROI from user mask", this);
|
|
connect(sub_button, &QPushButton::clicked, [this]() { emit SubtractROIFromUserMask(); });
|
|
|
|
QHBoxLayout *buttons_row = new QHBoxLayout();
|
|
buttons_row->setSpacing(12);
|
|
buttons_row->addWidget(add_button);
|
|
buttons_row->addWidget(sub_button);
|
|
|
|
layout->addLayout(buttons_row);
|
|
|
|
}
|
|
|
|
void JFJochViewerImageROIStatistics::loadImage(std::shared_ptr<const JFJochReaderImage> image) {
|
|
if (!image) {
|
|
roi_sum->setText("");
|
|
roi_mean->setText("");
|
|
roi_var->setText("");
|
|
roi_max->setText("");
|
|
roi_npixel->setText("");
|
|
} else {
|
|
auto roi = image->GetROI();
|
|
|
|
if (roi && roi->pixels > 0) {
|
|
auto roi_npixel_val = static_cast<double>(roi->pixels);
|
|
double roi_mean_val = static_cast<double>(roi->sum) / roi_npixel_val;
|
|
double variance = static_cast<double>(roi->sum_square) / roi_npixel_val - roi_mean_val * roi_mean_val;
|
|
|
|
roi_sum->setText(QString("Sum <b>%1</b>").arg(roi->sum));
|
|
roi_mean->setText(QString("Mean <b>%1</b>").arg(QString::number(roi_mean_val, 'f', 3)));
|
|
roi_var->setText(QString("Var <b>%1</b>").arg(QString::number(variance, 'f', 3)));
|
|
roi_max->setText(QString("Max <b>%1</b>").arg(roi->max_count));
|
|
roi_npixel->setText(QString("Pixels <b>%1</b>").arg(roi->pixels));
|
|
} else {
|
|
roi_sum->setText("");
|
|
roi_mean->setText("");
|
|
roi_var->setText("");
|
|
roi_max->setText("");
|
|
roi_npixel->setText("");
|
|
}
|
|
}
|
|
}
|
|
|
|
void JFJochViewerImageROIStatistics::SetROIBox(QRect box) {
|
|
box_radio->setChecked(true);
|
|
box_settings->ROIBoxConfigured(box);
|
|
circle_settings->Disable();
|
|
}
|
|
|
|
void JFJochViewerImageROIStatistics::SetROICircle(double x, double y, double radius) {
|
|
circle_radio->setChecked(true);
|
|
circle_settings->SetROICircle(CircleSettings{.x = x, .y = y, .r = radius});
|
|
box_settings->Disable();
|
|
}
|
|
|
|
void JFJochViewerImageROIStatistics::BoxButtonClicked() {
|
|
box_radio->setChecked(true);
|
|
box_settings->Enable();
|
|
circle_settings->Disable();
|
|
|
|
emit ROIBoxConfigured(box_settings->GetROIBox());
|
|
}
|
|
|
|
void JFJochViewerImageROIStatistics::CircleButtonClicked() {
|
|
circle_settings->Enable();
|
|
box_settings->Disable();
|
|
circle_radio->setChecked(true);
|
|
auto tmp = circle_settings->GetROICircle();
|
|
emit ROICircleConfigured(tmp.x, tmp.y, tmp.r);
|
|
}
|