Fixing flaw in gamma transform.
This commit is contained in:
@@ -112,7 +112,7 @@ namespace rtengine {
|
|||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
// gamma transform for input data
|
// gamma transform for input data
|
||||||
float gam = dnparams.gamma;
|
float gam = dnparams.gamma;
|
||||||
float gamthresh = 0.03;
|
float gamthresh = 0.001;
|
||||||
float gamslope = exp(log((double)gamthresh)/gam)/gamthresh;
|
float gamslope = exp(log((double)gamthresh)/gam)/gamthresh;
|
||||||
|
|
||||||
LUTf gamcurve(65536,0);
|
LUTf gamcurve(65536,0);
|
||||||
@@ -769,6 +769,9 @@ namespace rtengine {
|
|||||||
//simple wavelet shrinkage
|
//simple wavelet shrinkage
|
||||||
const float eps = 0.01f;
|
const float eps = 0.01f;
|
||||||
float * sfave = new float[W_L*H_L];
|
float * sfave = new float[W_L*H_L];
|
||||||
|
float * sfavea = new float[W_L*H_L];
|
||||||
|
float * sfaveb = new float[W_L*H_L];
|
||||||
|
|
||||||
int max;
|
int max;
|
||||||
|
|
||||||
printf("\n level=%d \n",level);
|
printf("\n level=%d \n",level);
|
||||||
@@ -797,14 +800,37 @@ namespace rtengine {
|
|||||||
float mag_a = SQR(WavCoeffs_a[dir][coeffloc_ab])+eps;
|
float mag_a = SQR(WavCoeffs_a[dir][coeffloc_ab])+eps;
|
||||||
float mag_b = SQR(WavCoeffs_b[dir][coeffloc_ab])+eps;
|
float mag_b = SQR(WavCoeffs_b[dir][coeffloc_ab])+eps;
|
||||||
|
|
||||||
|
sfavea[coeffloc_ab] = (1-exp(-(mag_a/mad_a)-(mag_L/(9*madL))));
|
||||||
|
sfaveb[coeffloc_ab] = (1-exp(-(mag_b/mad_b)-(mag_L/(9*madL))));
|
||||||
|
|
||||||
// 'firm' threshold of chroma coefficients
|
// 'firm' threshold of chroma coefficients
|
||||||
WavCoeffs_a[dir][coeffloc_ab] *= SQR(1-exp(-(mag_a/mad_a)-(mag_L/(9*madL))));//(coeff_a>2*thresh_a ? 1 : (coeff_a<thresh_a ? 0 : (coeff_a/thresh_a - 1)));
|
//WavCoeffs_a[dir][coeffloc_ab] *= (1-exp(-(mag_a/mad_a)-(mag_L/(9*madL))));//(coeff_a>2*thresh_a ? 1 : (coeff_a<thresh_a ? 0 : (coeff_a/thresh_a - 1)));
|
||||||
WavCoeffs_b[dir][coeffloc_ab] *= SQR(1-exp(-(mag_b/mad_b)-(mag_L/(9*madL))));//(coeff_b>2*thresh_b ? 1 : (coeff_b<thresh_b ? 0 : (coeff_b/thresh_b - 1)));
|
//WavCoeffs_b[dir][coeffloc_ab] *= (1-exp(-(mag_b/mad_b)-(mag_L/(9*madL))));//(coeff_b>2*thresh_b ? 1 : (coeff_b<thresh_b ? 0 : (coeff_b/thresh_b - 1)));
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}//now chrominance coefficients are denoised
|
}//now chrominance coefficients are denoised
|
||||||
|
|
||||||
|
boxblur(sfavea, sfavea, level+2, level+2, W_ab, H_ab);//increase smoothness by locally averaging shrinkage
|
||||||
|
boxblur(sfaveb, sfaveb, level+2, level+2, W_ab, H_ab);//increase smoothness by locally averaging shrinkage
|
||||||
|
for (int i=0; i<H_ab; i++)
|
||||||
|
for (int j=0; j<W_ab; j++) {
|
||||||
|
|
||||||
|
int coeffloc_ab = i*W_ab+j;
|
||||||
|
int coeffloc_L = ((i*skip_L)/skip_ab)*W_L + ((j*skip_L)/skip_ab);
|
||||||
|
|
||||||
|
float mag_L = SQR(WavCoeffs_L[dir][coeffloc_L ])+eps;
|
||||||
|
float mag_a = SQR(WavCoeffs_a[dir][coeffloc_ab])+eps;
|
||||||
|
float mag_b = SQR(WavCoeffs_b[dir][coeffloc_ab])+eps;
|
||||||
|
|
||||||
|
float sfa = (1-exp(-(mag_a/mad_a)-(mag_L/(9*madL))));
|
||||||
|
float sfb = (1-exp(-(mag_b/mad_b)-(mag_L/(9*madL))));
|
||||||
|
|
||||||
|
//use smoothed shrinkage unless local shrinkage is much less
|
||||||
|
WavCoeffs_a[dir][coeffloc_ab] *= (SQR(sfavea[coeffloc_ab])+SQR(sfa))/(sfavea[coeffloc_ab]+sfa+eps);
|
||||||
|
WavCoeffs_b[dir][coeffloc_ab] *= (SQR(sfaveb[coeffloc_ab])+SQR(sfb))/(sfaveb[coeffloc_ab]+sfb+eps);
|
||||||
|
|
||||||
|
}//now chrominance coefficients are denoised
|
||||||
}
|
}
|
||||||
|
|
||||||
if (noisevar_L>0.01) {
|
if (noisevar_L>0.01) {
|
||||||
@@ -834,6 +860,9 @@ namespace rtengine {
|
|||||||
|
|
||||||
}
|
}
|
||||||
delete[] sfave;
|
delete[] sfave;
|
||||||
|
delete[] sfavea;
|
||||||
|
delete[] sfaveb;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -102,6 +102,8 @@ void Crop::update (int todo) {
|
|||||||
PreviewProps pp (trafx, trafy, trafw*skip, trafh*skip, skip);
|
PreviewProps pp (trafx, trafy, trafw*skip, trafh*skip, skip);
|
||||||
parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.hlrecovery, params.icm, params.raw );
|
parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.hlrecovery, params.icm, params.raw );
|
||||||
|
|
||||||
|
//parent->imgsrc->convertColorSpace(origCrop, params.icm);
|
||||||
|
|
||||||
if (todo & M_LINDENOISE) {
|
if (todo & M_LINDENOISE) {
|
||||||
if (skip==1 && params.dirpyrDenoise.enabled) {
|
if (skip==1 && params.dirpyrDenoise.enabled) {
|
||||||
parent->ipf.RGB_denoise(origCrop, origCrop, /*Roffset,*/ params.dirpyrDenoise, params.defringe);
|
parent->ipf.RGB_denoise(origCrop, origCrop, /*Roffset,*/ params.dirpyrDenoise, params.defringe);
|
||||||
|
@@ -202,6 +202,8 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) {
|
|||||||
setScale (scale);
|
setScale (scale);
|
||||||
imgsrc->getImage (currWB, tr, orig_prev, pp, params.hlrecovery, params.icm, params.raw);
|
imgsrc->getImage (currWB, tr, orig_prev, pp, params.hlrecovery, params.icm, params.raw);
|
||||||
|
|
||||||
|
//imgsrc->convertColorSpace(orig_prev, params.icm);
|
||||||
|
|
||||||
if (todo & M_LINDENOISE) {
|
if (todo & M_LINDENOISE) {
|
||||||
//printf("denoising!\n");
|
//printf("denoising!\n");
|
||||||
if (scale==1 && params.dirpyrDenoise.enabled) {
|
if (scale==1 && params.dirpyrDenoise.enabled) {
|
||||||
|
Reference in New Issue
Block a user