Add saturation statistic
This commit is contained in:
+4
-2
@@ -436,8 +436,9 @@ void LoadRunable::run()
|
|||||||
{
|
{
|
||||||
double mean, median, min, max, mad;
|
double mean, median, min, max, mad;
|
||||||
double stdDev;
|
double stdDev;
|
||||||
|
uint32_t saturated;
|
||||||
timer.start();
|
timer.start();
|
||||||
rawImage->imageStats(&mean, &stdDev, &median, &min, &max, &mad);
|
rawImage->imageStats(&mean, &stdDev, &median, &min, &max, &mad, &saturated);
|
||||||
qDebug() << "image stats" << timer.restart();
|
qDebug() << "image stats" << timer.restart();
|
||||||
info.info.append({QObject::tr("Mean"), QString::number(mean)});
|
info.info.append({QObject::tr("Mean"), QString::number(mean)});
|
||||||
info.info.append({QObject::tr("Standart deviation"), QString::number(stdDev)});
|
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("Minimum"), QString::number(min)});
|
||||||
info.info.append({QObject::tr("Maximum"), QString::number(max)});
|
info.info.append({QObject::tr("Maximum"), QString::number(max)});
|
||||||
info.info.append({QObject::tr("MAD"), QString::number(mad)});
|
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)
|
if(m_analyzeLevel >= Peaks)
|
||||||
{
|
{
|
||||||
@@ -462,7 +464,7 @@ void LoadRunable::run()
|
|||||||
// drawPeaks(img, peaks);
|
// drawPeaks(img, peaks);
|
||||||
qDebug() << "draw peaks" << timer.restart();
|
qDebug() << "draw peaks" << timer.restart();
|
||||||
info.info.append({QObject::tr("Peaks"), QString::number(numPeaks)});
|
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)
|
if(m_analyzeLevel>= Stars)
|
||||||
{
|
{
|
||||||
|
|||||||
+10
-1
@@ -3,6 +3,7 @@
|
|||||||
int THUMB_SIZE = 128;
|
int THUMB_SIZE = 128;
|
||||||
int THUMB_SIZE_BORDER = 138;
|
int THUMB_SIZE_BORDER = 138;
|
||||||
int THUMB_SIZE_BORDER_Y = 158;
|
int THUMB_SIZE_BORDER_Y = 158;
|
||||||
|
double SATURATION = 0.95;
|
||||||
|
|
||||||
RawImage::ImgType CV2Type(int cvtype)
|
RawImage::ImgType CV2Type(int cvtype)
|
||||||
{
|
{
|
||||||
@@ -84,6 +85,7 @@ RawImage::RawImage(const RawImage &d)
|
|||||||
m_max = d.m_max;
|
m_max = d.m_max;
|
||||||
m_mad = d.m_mad;
|
m_mad = d.m_mad;
|
||||||
m_stats = d.m_stats;
|
m_stats = d.m_stats;
|
||||||
|
m_saturated = d.m_saturated;
|
||||||
}
|
}
|
||||||
|
|
||||||
RawImage::RawImage(const QImage &img)
|
RawImage::RawImage(const QImage &img)
|
||||||
@@ -126,7 +128,7 @@ RawImage::RawImage(const QImage &img)
|
|||||||
m_stats = false;
|
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(!m_stats)calcStats();
|
||||||
if(mean)*mean = m_mean;
|
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(min)*min = m_min;
|
||||||
if(max)*max = m_max;
|
if(max)*max = m_max;
|
||||||
if(mad)*mad = m_mad;
|
if(mad)*mad = m_mad;
|
||||||
|
if(saturated)*saturated = m_saturated;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -176,6 +179,12 @@ void RawImage::calcStats()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(img.type() == CV_32F)m_median /= histSize;
|
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<float>(0, i);
|
||||||
|
|
||||||
cv::Mat absDev;
|
cv::Mat absDev;
|
||||||
img.convertTo(absDev, CV_32F, 1, -m_median);
|
img.convertTo(absDev, CV_32F, 1, -m_median);
|
||||||
absDev = cv::abs(absDev);
|
absDev = cv::abs(absDev);
|
||||||
|
|||||||
+2
-1
@@ -48,6 +48,7 @@ protected:
|
|||||||
double m_max;
|
double m_max;
|
||||||
double m_mad;
|
double m_mad;
|
||||||
float m_thumbAspect;
|
float m_thumbAspect;
|
||||||
|
uint32_t m_saturated;
|
||||||
public:
|
public:
|
||||||
enum ImgType
|
enum ImgType
|
||||||
{
|
{
|
||||||
@@ -66,7 +67,7 @@ public:
|
|||||||
RawImage(cv::Mat &img);
|
RawImage(cv::Mat &img);
|
||||||
RawImage(const RawImage &d);
|
RawImage(const RawImage &d);
|
||||||
RawImage(const QImage &img);
|
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 calcStats();
|
||||||
void rect(int &x, int &y, int w, int h, std::vector<double> &r) const;
|
void rect(int &x, int &y, int w, int h, std::vector<double> &r) const;
|
||||||
int findPeaks(double background, double distance, std::vector<Peak> &peaks) const;
|
int findPeaks(double background, double distance, std::vector<Peak> &peaks) const;
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include "rawimage.h"
|
#include "rawimage.h"
|
||||||
|
|
||||||
extern int DEFAULT_WIDTH;
|
extern int DEFAULT_WIDTH;
|
||||||
|
extern double SATURATION;
|
||||||
|
|
||||||
class EvenNumber : public QSpinBox
|
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->setValue(settings.value("settings/thumnailsize", THUMB_SIZE).toInt());
|
||||||
m_thumSize->setToolTip(tr("Thumbnail size in pixels"));
|
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 = new QCheckBox(tr("Don't use native file dialog"), this);
|
||||||
m_useNativeDialog->setChecked(QApplication::testAttribute(Qt::AA_DontUseNativeDialogs));
|
m_useNativeDialog->setChecked(QApplication::testAttribute(Qt::AA_DontUseNativeDialogs));
|
||||||
|
|
||||||
layout->addRow(tr("Image preload count"), m_preloadImages);
|
layout->addRow(tr("Image preload count"), m_preloadImages);
|
||||||
layout->addRow(tr("Thumbnails size"), m_thumSize);
|
layout->addRow(tr("Thumbnails size"), m_thumSize);
|
||||||
|
layout->addRow(tr("Saturation"), m_saturation);
|
||||||
layout->addRow(m_useNativeDialog);
|
layout->addRow(m_useNativeDialog);
|
||||||
layout->addRow(new QLabel(tr("Changes in settings will take effect after program restart.")));
|
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 = settings.value("settings/thumbnailsize", THUMB_SIZE).toInt();
|
||||||
THUMB_SIZE_BORDER = THUMB_SIZE + 10;
|
THUMB_SIZE_BORDER = THUMB_SIZE + 10;
|
||||||
THUMB_SIZE_BORDER_Y = THUMB_SIZE + 30;
|
THUMB_SIZE_BORDER_Y = THUMB_SIZE + 30;
|
||||||
|
SATURATION = settings.value("settings/saturation", 95.0).toDouble() / 100.0;
|
||||||
return OLD_THUMB_SIZE != THUMB_SIZE;
|
return OLD_THUMB_SIZE != THUMB_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,6 +101,8 @@ void SettingsDialog::saveSettings()
|
|||||||
settings.setValue("settings/thumbnailsize", m_thumSize->value());
|
settings.setValue("settings/thumbnailsize", m_thumSize->value());
|
||||||
settings.setValue("settings/preloadimagecount", m_preloadImages->value());
|
settings.setValue("settings/preloadimagecount", m_preloadImages->value());
|
||||||
settings.setValue("settings/dontusenativedialogs", m_useNativeDialog->isChecked());
|
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());
|
QApplication::setAttribute(Qt::AA_DontUseNativeDialogs, m_useNativeDialog->isChecked());
|
||||||
if(DEFAULT_WIDTH != m_preloadImages->value())
|
if(DEFAULT_WIDTH != m_preloadImages->value())
|
||||||
emit preloadChanged(m_preloadImages->value());
|
emit preloadChanged(m_preloadImages->value());
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ private:
|
|||||||
|
|
||||||
QSpinBox *m_preloadImages;
|
QSpinBox *m_preloadImages;
|
||||||
QSpinBox *m_thumSize;
|
QSpinBox *m_thumSize;
|
||||||
|
QDoubleSpinBox *m_saturation;
|
||||||
QCheckBox *m_useNativeDialog;
|
QCheckBox *m_useNativeDialog;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -49,7 +49,7 @@ void StretchToolbar::stretchImage(Image *img)
|
|||||||
if(img->rawImage())
|
if(img->rawImage())
|
||||||
{
|
{
|
||||||
double median, mad, max;
|
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();
|
median /= img->rawImage()->norm();
|
||||||
mad /= img->rawImage()->norm();
|
mad /= img->rawImage()->norm();
|
||||||
max /= img->rawImage()->norm();
|
max /= img->rawImage()->norm();
|
||||||
|
|||||||
Reference in New Issue
Block a user