Support for unlinked stretch
This commit is contained in:
@@ -18,6 +18,7 @@
|
|||||||
<file>shaders/debayer.frag</file>
|
<file>shaders/debayer.frag</file>
|
||||||
<file>shaders/debayer.vert</file>
|
<file>shaders/debayer.vert</file>
|
||||||
<file>falsecolor.png</file>
|
<file>falsecolor.png</file>
|
||||||
|
<file>link.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
<qresource prefix="/" lang="en">
|
<qresource prefix="/" lang="en">
|
||||||
<file alias="help">about/help_en</file>
|
<file alias="help">about/help_en</file>
|
||||||
|
|||||||
+85
-53
@@ -23,7 +23,7 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar")
|
|||||||
m_stfSlider = new STFSlider(Qt::white, this);
|
m_stfSlider = new STFSlider(Qt::white, this);
|
||||||
vbox1->addWidget(m_stfSlider);
|
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_stfSliderG = new STFSlider(Qt::green, this);
|
||||||
m_stfSliderB = new STFSlider(Qt::blue, this);
|
m_stfSliderB = new STFSlider(Qt::blue, this);
|
||||||
QWidget *rgb = new QWidget(this);
|
QWidget *rgb = new QWidget(this);
|
||||||
@@ -31,12 +31,12 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar")
|
|||||||
vbox2->setSpacing(0);
|
vbox2->setSpacing(0);
|
||||||
vbox2->addWidget(m_stfSliderR);
|
vbox2->addWidget(m_stfSliderR);
|
||||||
vbox2->addWidget(m_stfSliderG);
|
vbox2->addWidget(m_stfSliderG);
|
||||||
vbox2->addWidget(m_stfSliderB);*/
|
vbox2->addWidget(m_stfSliderB);
|
||||||
|
|
||||||
m_stack = new QStackedWidget(this);
|
m_stack = new QStackedWidget(this);
|
||||||
m_stack->addWidget(lum);
|
m_stack->addWidget(lum);
|
||||||
//m_stack->addWidget(rgb);
|
m_stack->addWidget(rgb);
|
||||||
//m_stack->setCurrentIndex(0);
|
m_stack->setCurrentIndex(0);
|
||||||
addWidget(m_stack);
|
addWidget(m_stack);
|
||||||
|
|
||||||
connect(m_stfSlider, &STFSlider::paramChanged, [this](float blackPoint, float midPoint, float whitePoint){
|
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;
|
m_mtfParam.whitePoint[0] = m_mtfParam.whitePoint[1] = m_mtfParam.whitePoint[2] = whitePoint;
|
||||||
emit paramChanged(m_mtfParam);
|
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.blackPoint[0] = blackPoint;
|
||||||
m_mtfParam.midPoint[0] = midPoint;
|
m_mtfParam.midPoint[0] = midPoint;
|
||||||
m_mtfParam.whitePoint[0] = whitePoint;
|
m_mtfParam.whitePoint[0] = whitePoint;
|
||||||
@@ -62,7 +62,11 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar")
|
|||||||
m_mtfParam.midPoint[2] = midPoint;
|
m_mtfParam.midPoint[2] = midPoint;
|
||||||
m_mtfParam.whitePoint[2] = whitePoint;
|
m_mtfParam.whitePoint[2] = whitePoint;
|
||||||
emit paramChanged(m_mtfParam);
|
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"));
|
QAction *autoStretchButton = addAction(QIcon(":/nuke.png"), tr("Auto Stretch F12"));
|
||||||
autoStretchButton->setShortcut(Qt::Key_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"));
|
QAction *invertButton = addAction(QIcon(":/invert.png"), tr("Invert colors"));
|
||||||
invertButton->setCheckable(true);
|
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"));
|
QAction *falseColorButton = addAction(QIcon(":/falsecolor.png"), tr("False color"));
|
||||||
falseColorButton->setCheckable(true);
|
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"));
|
QAction *superPixelButton = addAction(QIcon(":/bayer.png"), tr("Debayer CFA"));
|
||||||
superPixelButton->setCheckable(true);
|
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 = addAction(QIcon(":/nuke_a.png"), tr("Apply auto stretch on load"));
|
||||||
m_autoStretchOnLoad->setCheckable(true);
|
m_autoStretchOnLoad->setCheckable(true);
|
||||||
@@ -90,49 +94,52 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar")
|
|||||||
|
|
||||||
void StretchToolbar::stretchImage(Image *img)
|
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();
|
double median, mad, max;
|
||||||
int ch = img->rawImage()->channels() == 1 ? 1 : 3;
|
median = stats.m_median[i];
|
||||||
float bp2 = 0;
|
mad = stats.m_mad[i];
|
||||||
float mid2 = 0;
|
max = stats.m_max[i];
|
||||||
float max2 = 0;
|
median /= img->rawImage()->norm();
|
||||||
for(int i=0; i < ch; i++)
|
mad /= img->rawImage()->norm();
|
||||||
{
|
max /= img->rawImage()->norm();
|
||||||
double median, mad, max;
|
if(max>1.0f)max = 1.0f;
|
||||||
median = stats.m_median[i];
|
float bp = median + mad * BLACK_POINT_SIGMA * MAD_TO_SIGMA;
|
||||||
mad = stats.m_mad[i];
|
float mid = MTF(median - bp, TARGET_BACKGROUND);
|
||||||
max = stats.m_max[i];
|
m_mtfParam.blackPoint[i] = bp;
|
||||||
median /= img->rawImage()->norm();
|
m_mtfParam.midPoint[i] = mid;
|
||||||
mad /= img->rawImage()->norm();
|
m_mtfParam.whitePoint[i] = max;
|
||||||
max /= img->rawImage()->norm();
|
bp2 += bp;
|
||||||
if(max>1.0f)max = 1.0f;
|
mid2 += mid;
|
||||||
float bp = median + mad * BLACK_POINT_SIGMA * MAD_TO_SIGMA;
|
max2 += max;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
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;
|
MTFParam params;
|
||||||
m_mtfParam = params;
|
m_mtfParam = params;
|
||||||
m_stfSlider->setMTFParams(0, 0.5, 1);
|
if(m_stack->currentIndex() == 0)
|
||||||
m_stfSliderR->setMTFParams(0, 0.5, 1);
|
{
|
||||||
m_stfSliderG->setMTFParams(0, 0.5, 1);
|
m_stfSlider->setMTFParams(0, 0.5, 1);
|
||||||
m_stfSliderB->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);
|
emit paramChanged(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,3 +165,22 @@ void StretchToolbar::imageLoaded(Image *img)
|
|||||||
if(m_autoStretchOnLoad->isChecked())
|
if(m_autoStretchOnLoad->isChecked())
|
||||||
stretchImage(img);
|
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);
|
||||||
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ public slots:
|
|||||||
void stretchImage(Image *img);
|
void stretchImage(Image *img);
|
||||||
void resetMTF();
|
void resetMTF();
|
||||||
void imageLoaded(Image *img);
|
void imageLoaded(Image *img);
|
||||||
|
void unlinkStretch(bool enable);
|
||||||
signals:
|
signals:
|
||||||
void paramChanged(const MTFParam ¶ms);
|
void paramChanged(const MTFParam ¶ms);
|
||||||
void autoStretch();
|
void autoStretch();
|
||||||
|
|||||||
Reference in New Issue
Block a user