From 023a616fa0509b4d1a51164c72fcb80a03748d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Wed, 6 Apr 2022 15:49:58 +0200 Subject: [PATCH] Stretch and calculate stats on demand --- loadrunable.cpp | 8 +++----- mainwindow.cpp | 13 ++++++------ mainwindow.h | 2 ++ rawimage.cpp | 53 +++++++++++++++++++++++++++++++++--------------- rawimage.h | 6 +++--- stretchpanel.cpp | 15 +++++++++----- stretchpanel.h | 3 ++- 7 files changed, 63 insertions(+), 37 deletions(-) diff --git a/loadrunable.cpp b/loadrunable.cpp index 169868c..9bd199b 100644 --- a/loadrunable.cpp +++ b/loadrunable.cpp @@ -257,21 +257,19 @@ void LoadRunable::run() rawImage = new RawImage(img); } - if(rawImage) - rawImage->calcStats(); - if(rawImage && m_analyzeLevel >= Statistics) { - double mean, median, min, max; + double mean, median, min, max, mad; double stdDev; timer.start(); - rawImage->imageStats(&mean, &stdDev, &median, &min, &max); + rawImage->imageStats(&mean, &stdDev, &median, &min, &max, &mad); qDebug() << "image stats" << timer.restart(); info.append(StringPair(QObject::tr("Mean"), QString::number(mean))); info.append(StringPair(QObject::tr("Standart deviation"), QString::number(stdDev))); info.append(StringPair(QObject::tr("Median"), QString::number(median))); info.append(StringPair(QObject::tr("Minimum"), QString::number(min))); info.append(StringPair(QObject::tr("Maximum"), QString::number(max))); + info.append(StringPair(QObject::tr("MAD"), QString::number(mad))); if(m_analyzeLevel >= Peaks) { diff --git a/mainwindow.cpp b/mainwindow.cpp index 6399212..5c820cc 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,5 +1,4 @@ #include "mainwindow.h" -#include "stretchpanel.h" #include #include #include @@ -34,23 +33,24 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) infoDock->setWidget(m_info); infoDock->setObjectName("infoDock"); addDockWidget(Qt::LeftDockWidgetArea, infoDock); - m_image = new ImageScrollArea(this); - m_image->resize(0,0); + //m_image = new ImageScrollArea(this); + //m_image->resize(0,0); //setCentralWidget(m_image); resize(800, 600); m_imageGL = new ImageScrollAreaGL(this); setCentralWidget(m_imageGL); - StretchPanel *stretchPanel = new StretchPanel(this); - connect(stretchPanel, SIGNAL(paramChanged(float,float,float)), m_imageGL->imageWidget(), SLOT(setMTFParams(float,float,float))); + m_stretchPanel = new StretchPanel(this); + connect(m_stretchPanel, SIGNAL(paramChanged(float,float,float)), m_imageGL->imageWidget(), SLOT(setMTFParams(float,float,float))); + connect(m_stretchPanel, &StretchPanel::autoStretch, [&](){ m_stretchPanel->stretchImage(m_ringList->currentImage().get()); }); m_ringList = new ImageRingList(this); m_filesystem = new FilesystemWidget(m_ringList, this); connect(m_filesystem, SIGNAL(fileSelected(int)), this, SLOT(loadFile(int))); QDockWidget *stretchDock = new QDockWidget(tr("Stretch"), this); - stretchDock->setWidget(stretchPanel); + stretchDock->setWidget(m_stretchPanel); stretchDock->setObjectName("strechDock"); addDockWidget(Qt::TopDockWidgetArea, stretchDock); @@ -62,7 +62,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) setWindowTitle(tr("Tenmon")); connect(m_ringList, SIGNAL(pixmapLoaded(Image*)), this, SLOT(pixmapLoaded(Image*))); - connect(m_ringList, SIGNAL(pixmapLoaded(Image*)), stretchPanel, SLOT(imageLoaded(Image*))); connect(m_ringList, SIGNAL(currentImageChanged(int)), this, SLOT(updateWindowTitle())); connect(m_ringList, SIGNAL(infoLoaded(ImageInfoData)), m_info, SLOT(setInfo(ImageInfoData))); connect(m_ringList, SIGNAL(currentImageChanged(int)), m_filesystem, SLOT(selectFile(int))); diff --git a/mainwindow.h b/mainwindow.h index e9401bd..5e883dc 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -9,6 +9,7 @@ #include "imageinfo.h" #include "imagescrollareagl.h" #include "filesystemwidget.h" +#include "stretchpanel.h" class MainWindow : public QMainWindow { @@ -16,6 +17,7 @@ class MainWindow : public QMainWindow ImageScrollArea *m_image; ImageScrollAreaGL *m_imageGL; ImageRingList *m_ringList; + StretchPanel *m_stretchPanel; Database *m_database; ImageInfo *m_info; FilesystemWidget *m_filesystem; diff --git a/rawimage.cpp b/rawimage.cpp index f052333..e6b760a 100644 --- a/rawimage.cpp +++ b/rawimage.cpp @@ -52,17 +52,19 @@ int Type2CV(RawImage::ImgType type) RawImage::RawImage() { + m_stats = false; } RawImage::RawImage(int w, int h, ImgType type) { m_img.create(h, w, Type2CV(type)); + m_stats = false; } RawImage::RawImage(cv::Mat &img) { m_img = img; - calcStats(); + m_stats = false; } RawImage::RawImage(const RawImage &d) @@ -73,6 +75,8 @@ RawImage::RawImage(const RawImage &d) m_median = d.m_median; m_min = d.m_min; m_max = d.m_max; + m_mad = d.m_mad; + m_stats = d.m_stats; } RawImage::RawImage(const QImage &img) @@ -91,33 +95,44 @@ RawImage::RawImage(const QImage &img) for(int i=0; i &r) const; int findPeaks(double background, double distance, std::vector &peaks) const; @@ -68,10 +69,9 @@ public: uint32_t height() const; uint32_t size() const; ImgType type() const; + uint32_t norm() const; void* data(); const void* data() const; - float stretchFactor() const; - double MAD() const; }; #endif // RAWIMAGE_H diff --git a/stretchpanel.cpp b/stretchpanel.cpp index 83c6142..44a9551 100644 --- a/stretchpanel.cpp +++ b/stretchpanel.cpp @@ -28,18 +28,23 @@ StretchPanel::StretchPanel(QWidget *parent) : QWidget(parent) resetButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); layout->addWidget(resetButton); connect(resetButton, SIGNAL(pressed()), this, SLOT(resetMTF())); + + QPushButton *autoStretchButton = new QPushButton(tr("Autostretch"), this); + autoStretchButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); + layout->addWidget(autoStretchButton); + connect(autoStretchButton, SIGNAL(pressed()), this, SIGNAL(autoStretch())); } -void StretchPanel::imageLoaded(Image *img) +void StretchPanel::stretchImage(Image *img) { if(img) { if(img->rawImage()) { - double mean, stdDev, median; - img->rawImage()->imageStats(&mean, &stdDev, &median, nullptr, nullptr); - median /= 65536; - double mad = img->rawImage()->MAD() / 65536; + double median, mad; + img->rawImage()->imageStats(nullptr, nullptr, &median, nullptr, nullptr, &mad); + median /= img->rawImage()->norm(); + mad /= img->rawImage()->norm(); float bp = median + mad * BLACK_POINT_SIGMA * MAD_TO_SIGMA; float mid = MTF(median - bp, TARGET_BACKGROUND); m_stfSlider->setMTFParams(bp, mid, 1.0f); diff --git a/stretchpanel.h b/stretchpanel.h index 793be62..d468792 100644 --- a/stretchpanel.h +++ b/stretchpanel.h @@ -13,10 +13,11 @@ class StretchPanel : public QWidget public: explicit StretchPanel(QWidget *parent = nullptr); public slots: - void imageLoaded(Image *img); + void stretchImage(Image *img); void resetMTF(); signals: void paramChanged(float low, float mid, float high); + void autoStretch(); }; #endif // STRETCHPANEL_H