diff --git a/link.png b/link.png new file mode 100644 index 0000000..b11d3ba Binary files /dev/null and b/link.png differ diff --git a/resources.qrc b/resources.qrc index a2e2a7b..b71d1ce 100644 --- a/resources.qrc +++ b/resources.qrc @@ -18,6 +18,7 @@ shaders/debayer.frag shaders/debayer.vert falsecolor.png + link.png about/help_en diff --git a/stretchtoolbar.cpp b/stretchtoolbar.cpp index b4ee306..ade2411 100644 --- a/stretchtoolbar.cpp +++ b/stretchtoolbar.cpp @@ -23,7 +23,7 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar") m_stfSlider = new STFSlider(Qt::white, this); vbox1->addWidget(m_stfSlider); - /*m_stfSliderR = new STFSlider(Qt::red, this); + m_stfSliderR = new STFSlider(Qt::red, this); m_stfSliderG = new STFSlider(Qt::green, this); m_stfSliderB = new STFSlider(Qt::blue, this); QWidget *rgb = new QWidget(this); @@ -31,12 +31,12 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar") vbox2->setSpacing(0); vbox2->addWidget(m_stfSliderR); vbox2->addWidget(m_stfSliderG); - vbox2->addWidget(m_stfSliderB);*/ + vbox2->addWidget(m_stfSliderB); m_stack = new QStackedWidget(this); m_stack->addWidget(lum); - //m_stack->addWidget(rgb); - //m_stack->setCurrentIndex(0); + m_stack->addWidget(rgb); + m_stack->setCurrentIndex(0); addWidget(m_stack); connect(m_stfSlider, &STFSlider::paramChanged, [this](float blackPoint, float midPoint, float whitePoint){ @@ -45,7 +45,7 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar") m_mtfParam.whitePoint[0] = m_mtfParam.whitePoint[1] = m_mtfParam.whitePoint[2] = whitePoint; emit paramChanged(m_mtfParam); }); - /*connect(m_stfSliderR, &STFSlider::paramChanged, [this](float blackPoint, float midPoint, float whitePoint){ + connect(m_stfSliderR, &STFSlider::paramChanged, [this](float blackPoint, float midPoint, float whitePoint){ m_mtfParam.blackPoint[0] = blackPoint; m_mtfParam.midPoint[0] = midPoint; m_mtfParam.whitePoint[0] = whitePoint; @@ -62,7 +62,11 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar") m_mtfParam.midPoint[2] = midPoint; m_mtfParam.whitePoint[2] = whitePoint; emit paramChanged(m_mtfParam); - });*/ + }); + + QAction *rgbStretch = addAction(QIcon(":/link.png"), tr("Linked stretch")); + rgbStretch->setCheckable(true); + connect(rgbStretch, &QAction::toggled, this, &StretchToolbar::unlinkStretch); QAction *autoStretchButton = addAction(QIcon(":/nuke.png"), tr("Auto Stretch F12")); autoStretchButton->setShortcut(Qt::Key_F12); @@ -74,15 +78,15 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar") QAction *invertButton = addAction(QIcon(":/invert.png"), tr("Invert colors")); invertButton->setCheckable(true); - connect(invertButton, SIGNAL(toggled(bool)), this, SIGNAL(invert(bool))); + connect(invertButton, &QAction::toggled, this, &StretchToolbar::invert); QAction *falseColorButton = addAction(QIcon(":/falsecolor.png"), tr("False color")); falseColorButton->setCheckable(true); - connect(falseColorButton, SIGNAL(toggled(bool)), this, SIGNAL(falseColor(bool))); + connect(falseColorButton, &QAction::toggled, this, &StretchToolbar::falseColor); QAction *superPixelButton = addAction(QIcon(":/bayer.png"), tr("Debayer CFA")); superPixelButton->setCheckable(true); - connect(superPixelButton, SIGNAL(toggled(bool)), this, SIGNAL(superPixel(bool))); + connect(superPixelButton, &QAction::toggled, this, &StretchToolbar::superPixel); m_autoStretchOnLoad = addAction(QIcon(":/nuke_a.png"), tr("Apply auto stretch on load")); m_autoStretchOnLoad->setCheckable(true); @@ -90,49 +94,52 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar") void StretchToolbar::stretchImage(Image *img) { - if(img) + if(img && img->rawImage()) { - if(img->rawImage()) + const RawImage::Stats &stats = img->rawImage()->imageStats(); + int ch = img->rawImage()->channels() == 1 ? 1 : 3; + float bp2 = 0; + float mid2 = 0; + float max2 = 0; + for(int i=0; i < ch; i++) { - const RawImage::Stats &stats = img->rawImage()->imageStats(); - int ch = img->rawImage()->channels() == 1 ? 1 : 3; - float bp2 = 0; - float mid2 = 0; - float max2 = 0; - for(int i=0; i < ch; i++) - { - double median, mad, max; - median = stats.m_median[i]; - mad = stats.m_mad[i]; - max = stats.m_max[i]; - median /= img->rawImage()->norm(); - mad /= img->rawImage()->norm(); - max /= img->rawImage()->norm(); - if(max>1.0f)max = 1.0f; - float bp = median + mad * BLACK_POINT_SIGMA * MAD_TO_SIGMA; - float mid = MTF(median - bp, TARGET_BACKGROUND); - m_mtfParam.blackPoint[i] = bp; - m_mtfParam.midPoint[i] = mid; - m_mtfParam.whitePoint[i] = max; - bp2 += bp; - mid2 += mid; - max2 += max; - } - if(m_stack->currentIndex() == 0) - { - m_mtfParam.blackPoint[0] = m_mtfParam.blackPoint[1] = m_mtfParam.blackPoint[2] = bp2 / ch; - m_mtfParam.midPoint[0] = m_mtfParam.midPoint[1] = m_mtfParam.midPoint[2] = mid2 / ch; - m_mtfParam.whitePoint[0] = m_mtfParam.whitePoint[1] = m_mtfParam.whitePoint[2] = max2 / ch; - m_stfSlider->setMTFParams(m_mtfParam.blackPoint[0], m_mtfParam.midPoint[0], m_mtfParam.whitePoint[0]); - } - else - { - m_stfSliderR->setMTFParams(m_mtfParam.blackPoint[0], m_mtfParam.midPoint[0], m_mtfParam.whitePoint[0]); - m_stfSliderG->setMTFParams(m_mtfParam.blackPoint[1], m_mtfParam.midPoint[1], m_mtfParam.whitePoint[1]); - m_stfSliderB->setMTFParams(m_mtfParam.blackPoint[2], m_mtfParam.midPoint[2], m_mtfParam.whitePoint[2]); - } - emit paramChanged(m_mtfParam); + double median, mad, max; + median = stats.m_median[i]; + mad = stats.m_mad[i]; + max = stats.m_max[i]; + median /= img->rawImage()->norm(); + mad /= img->rawImage()->norm(); + max /= img->rawImage()->norm(); + if(max>1.0f)max = 1.0f; + float bp = median + mad * BLACK_POINT_SIGMA * MAD_TO_SIGMA; + float mid = MTF(median - bp, TARGET_BACKGROUND); + m_mtfParam.blackPoint[i] = bp; + m_mtfParam.midPoint[i] = mid; + m_mtfParam.whitePoint[i] = max; + bp2 += bp; + mid2 += mid; + max2 += max; } + if(ch == 1) + { + m_mtfParam.blackPoint[1] = m_mtfParam.blackPoint[2] = m_mtfParam.blackPoint[0]; + m_mtfParam.midPoint[1] = m_mtfParam.midPoint[2] = m_mtfParam.midPoint[0]; + m_mtfParam.whitePoint[1] = m_mtfParam.whitePoint[2] = m_mtfParam.whitePoint[0]; + } + if(m_stack->currentIndex() == 0) + { + m_mtfParam.blackPoint[0] = m_mtfParam.blackPoint[1] = m_mtfParam.blackPoint[2] = bp2 / ch; + m_mtfParam.midPoint[0] = m_mtfParam.midPoint[1] = m_mtfParam.midPoint[2] = mid2 / ch; + m_mtfParam.whitePoint[0] = m_mtfParam.whitePoint[1] = m_mtfParam.whitePoint[2] = max2 / ch; + m_stfSlider->setMTFParams(m_mtfParam.blackPoint[0], m_mtfParam.midPoint[0], m_mtfParam.whitePoint[0]); + } + else + { + m_stfSliderR->setMTFParams(m_mtfParam.blackPoint[0], m_mtfParam.midPoint[0], m_mtfParam.whitePoint[0]); + m_stfSliderG->setMTFParams(m_mtfParam.blackPoint[1], m_mtfParam.midPoint[1], m_mtfParam.whitePoint[1]); + m_stfSliderB->setMTFParams(m_mtfParam.blackPoint[2], m_mtfParam.midPoint[2], m_mtfParam.whitePoint[2]); + } + emit paramChanged(m_mtfParam); } } @@ -140,10 +147,16 @@ void StretchToolbar::resetMTF() { MTFParam params; m_mtfParam = params; - m_stfSlider->setMTFParams(0, 0.5, 1); - m_stfSliderR->setMTFParams(0, 0.5, 1); - m_stfSliderG->setMTFParams(0, 0.5, 1); - m_stfSliderB->setMTFParams(0, 0.5, 1); + if(m_stack->currentIndex() == 0) + { + m_stfSlider->setMTFParams(0, 0.5, 1); + } + else + { + m_stfSliderR->setMTFParams(0, 0.5, 1); + m_stfSliderG->setMTFParams(0, 0.5, 1); + m_stfSliderB->setMTFParams(0, 0.5, 1); + } emit paramChanged(params); } @@ -152,3 +165,22 @@ void StretchToolbar::imageLoaded(Image *img) if(m_autoStretchOnLoad->isChecked()) stretchImage(img); } + +void StretchToolbar::unlinkStretch(bool enable) +{ + if(enable) + { + m_stack->setCurrentIndex(1); + m_mtfParam.blackPoint[0] = m_stfSliderR->blackPoint(); m_mtfParam.midPoint[0] = m_stfSliderR->midPoint(); m_mtfParam.whitePoint[0] = m_stfSliderR->whitePoint(); + m_mtfParam.blackPoint[1] = m_stfSliderG->blackPoint(); m_mtfParam.midPoint[1] = m_stfSliderG->midPoint(); m_mtfParam.whitePoint[1] = m_stfSliderG->whitePoint(); + m_mtfParam.blackPoint[2] = m_stfSliderB->blackPoint(); m_mtfParam.midPoint[2] = m_stfSliderB->midPoint(); m_mtfParam.whitePoint[2] = m_stfSliderB->whitePoint(); + } + else + { + m_stack->setCurrentIndex(0); + m_mtfParam.blackPoint[0] = m_mtfParam.blackPoint[1] = m_mtfParam.blackPoint[2] = m_stfSlider->blackPoint(); + m_mtfParam.midPoint[0] = m_mtfParam.midPoint[1] = m_mtfParam.midPoint[2] = m_stfSlider->midPoint(); + m_mtfParam.whitePoint[0] = m_mtfParam.whitePoint[1] = m_mtfParam.whitePoint[2] = m_mtfParam.whitePoint[2] = m_stfSlider->whitePoint(); + } + emit paramChanged(m_mtfParam); +} diff --git a/stretchtoolbar.h b/stretchtoolbar.h index 3ec895d..8b35b9d 100644 --- a/stretchtoolbar.h +++ b/stretchtoolbar.h @@ -30,6 +30,7 @@ public slots: void stretchImage(Image *img); void resetMTF(); void imageLoaded(Image *img); + void unlinkStretch(bool enable); signals: void paramChanged(const MTFParam ¶ms); void autoStretch();