diff --git a/loadrunable.cpp b/loadrunable.cpp index 9f0b8f2..0e2eb46 100644 --- a/loadrunable.cpp +++ b/loadrunable.cpp @@ -436,8 +436,9 @@ void LoadRunable::run() { double mean, median, min, max, mad; double stdDev; + uint32_t saturated; timer.start(); - rawImage->imageStats(&mean, &stdDev, &median, &min, &max, &mad); + rawImage->imageStats(&mean, &stdDev, &median, &min, &max, &mad, &saturated); qDebug() << "image stats" << timer.restart(); info.info.append({QObject::tr("Mean"), QString::number(mean)}); info.info.append({QObject::tr("Standart deviation"), QString::number(stdDev)}); @@ -445,6 +446,7 @@ void LoadRunable::run() info.info.append({QObject::tr("Minimum"), QString::number(min)}); info.info.append({QObject::tr("Maximum"), QString::number(max)}); info.info.append({QObject::tr("MAD"), QString::number(mad)}); + info.info.append({QObject::tr("Saturated"), QString::number(100.0 * saturated / rawImage->size()) + "%"}); if(m_analyzeLevel >= Peaks) { @@ -462,7 +464,7 @@ void LoadRunable::run() // drawPeaks(img, peaks); qDebug() << "draw peaks" << timer.restart(); info.info.append({QObject::tr("Peaks"), QString::number(numPeaks)}); - info.info.append({QObject::tr("Peaks draw"), QString::number(peaks.size())}); + //info.info.append({QObject::tr("Peaks draw"), QString::number(peaks.size())}); if(m_analyzeLevel>= Stars) { diff --git a/rawimage.cpp b/rawimage.cpp index b64a1f2..ee969f5 100644 --- a/rawimage.cpp +++ b/rawimage.cpp @@ -3,6 +3,7 @@ int THUMB_SIZE = 128; int THUMB_SIZE_BORDER = 138; int THUMB_SIZE_BORDER_Y = 158; +double SATURATION = 0.95; RawImage::ImgType CV2Type(int cvtype) { @@ -84,6 +85,7 @@ RawImage::RawImage(const RawImage &d) m_max = d.m_max; m_mad = d.m_mad; m_stats = d.m_stats; + m_saturated = d.m_saturated; } RawImage::RawImage(const QImage &img) @@ -126,7 +128,7 @@ RawImage::RawImage(const QImage &img) m_stats = false; } -bool RawImage::imageStats(double *mean, double *stdDev, double *median, double *min, double *max, double *mad) +bool RawImage::imageStats(double *mean, double *stdDev, double *median, double *min, double *max, double *mad, uint32_t *saturated) { if(!m_stats)calcStats(); if(mean)*mean = m_mean; @@ -135,6 +137,7 @@ bool RawImage::imageStats(double *mean, double *stdDev, double *median, double * if(min)*min = m_min; if(max)*max = m_max; if(mad)*mad = m_mad; + if(saturated)*saturated = m_saturated; return true; } @@ -176,6 +179,12 @@ void RawImage::calcStats() } } if(img.type() == CV_32F)m_median /= histSize; + + int threshold = SATURATION * histSize; + m_saturated = 0; + for(int i = histSize-1; i >= threshold; i--) + m_saturated += hist.at(0, i); + cv::Mat absDev; img.convertTo(absDev, CV_32F, 1, -m_median); absDev = cv::abs(absDev); diff --git a/rawimage.h b/rawimage.h index 7670386..4604214 100644 --- a/rawimage.h +++ b/rawimage.h @@ -48,6 +48,7 @@ protected: double m_max; double m_mad; float m_thumbAspect; + uint32_t m_saturated; public: enum ImgType { @@ -66,7 +67,7 @@ public: RawImage(cv::Mat &img); RawImage(const RawImage &d); RawImage(const QImage &img); - bool imageStats(double *mean, double *stdDev, double *median, double *min, double *max, double *mad); + bool imageStats(double *mean, double *stdDev, double *median, double *min, double *max, double *mad, uint32_t *saturated); void calcStats(); void rect(int &x, int &y, int w, int h, std::vector &r) const; int findPeaks(double background, double distance, std::vector &peaks) const; diff --git a/settingsdialog.cpp b/settingsdialog.cpp index 4295399..7c0eca4 100644 --- a/settingsdialog.cpp +++ b/settingsdialog.cpp @@ -7,6 +7,7 @@ #include "rawimage.h" extern int DEFAULT_WIDTH; +extern double SATURATION; class EvenNumber : public QSpinBox { @@ -48,11 +49,19 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent) m_thumSize->setValue(settings.value("settings/thumnailsize", THUMB_SIZE).toInt()); m_thumSize->setToolTip(tr("Thumbnail size in pixels")); + m_saturation = new QDoubleSpinBox(this); + m_saturation->setMinimum(0); + m_saturation->setMaximum(100); + m_saturation->setSuffix(" %"); + m_saturation->setValue(settings.value("settings/saturation", SATURATION * 100.0).toDouble()); + m_saturation->setToolTip(tr("Set threshold value that is considered saturated when showing statistics.\nFor RAW files you may set 22%")); + m_useNativeDialog = new QCheckBox(tr("Don't use native file dialog"), this); m_useNativeDialog->setChecked(QApplication::testAttribute(Qt::AA_DontUseNativeDialogs)); layout->addRow(tr("Image preload count"), m_preloadImages); layout->addRow(tr("Thumbnails size"), m_thumSize); + layout->addRow(tr("Saturation"), m_saturation); layout->addRow(m_useNativeDialog); layout->addRow(new QLabel(tr("Changes in settings will take effect after program restart."))); @@ -82,6 +91,7 @@ bool SettingsDialog::loadThumbsizes() THUMB_SIZE = settings.value("settings/thumbnailsize", THUMB_SIZE).toInt(); THUMB_SIZE_BORDER = THUMB_SIZE + 10; THUMB_SIZE_BORDER_Y = THUMB_SIZE + 30; + SATURATION = settings.value("settings/saturation", 95.0).toDouble() / 100.0; return OLD_THUMB_SIZE != THUMB_SIZE; } @@ -91,6 +101,8 @@ void SettingsDialog::saveSettings() settings.setValue("settings/thumbnailsize", m_thumSize->value()); settings.setValue("settings/preloadimagecount", m_preloadImages->value()); settings.setValue("settings/dontusenativedialogs", m_useNativeDialog->isChecked()); + settings.setValue("settings/saturation", m_saturation->value()); + SATURATION = m_saturation->value() / 100.0; QApplication::setAttribute(Qt::AA_DontUseNativeDialogs, m_useNativeDialog->isChecked()); if(DEFAULT_WIDTH != m_preloadImages->value()) emit preloadChanged(m_preloadImages->value()); diff --git a/settingsdialog.h b/settingsdialog.h index e7736ed..f7e90e4 100644 --- a/settingsdialog.h +++ b/settingsdialog.h @@ -19,6 +19,7 @@ private: QSpinBox *m_preloadImages; QSpinBox *m_thumSize; + QDoubleSpinBox *m_saturation; QCheckBox *m_useNativeDialog; }; diff --git a/stretchtoolbar.cpp b/stretchtoolbar.cpp index 42de1c2..8885588 100644 --- a/stretchtoolbar.cpp +++ b/stretchtoolbar.cpp @@ -49,7 +49,7 @@ void StretchToolbar::stretchImage(Image *img) if(img->rawImage()) { double median, mad, max; - img->rawImage()->imageStats(nullptr, nullptr, &median, nullptr, &max, &mad); + img->rawImage()->imageStats(nullptr, nullptr, &median, nullptr, &max, &mad, nullptr); median /= img->rawImage()->norm(); mad /= img->rawImage()->norm(); max /= img->rawImage()->norm();