Hi Rüdiger,
I think the problem is now fixed. Please try the following modified version of the noise evaluation script with your images:
/*
* NoiseEvaluation v1.1
*
* Automatic evaluation of Gaussian noise by the iterative multiresolution
* support and k-sigma thresholding methods.
*
* Copyright (C) 2006-2011 Pleiades Astrophoto S.L.
* Written by Juan Conejero (PTeam)
*
* References:
*
* - Jean-Luc Starck, Fionn Murtagh, Automatic Noise Estimation from the
* Multiresolution Support, Publications of the Royal Astronomical Society
* of the Pacific, vol. 110, February 1998, pp. 193-199.
*
* - J.L. Starck, F. Murtagh, Astronomical Image and Data Analysis, Springer,
* 1st ed., 2002, pp. 37-38.
*/
#feature-id Image Analysis > NoiseEvaluation v1.1
#feature-info \
Automatic estimation of Gaussian noise by the iterative multiresolution \
support and k-sigma thresholding algorithms.<br>\
<br>\
Written by Juan Conejero (PTeam).<br>\
<br>\
References:<br>\
<br>\
Jean-Luc Starck, Fionn Murtagh, <i>Automatic Noise Estimation from the \
Multiresolution Support</i>, Publications of the Royal Astronomical Society \
of the Pacific, vol. 110, February 1998, pp. 193-199.<br>\
<br>\
J.L. Starck, F. Murtagh, <i>Astronomical Image and Data Analysis</i>, Springer, \
1st ed., 2002, pp. 37-38.<br>\
<br>\
Copyright (c) 2006-2011 Pleiades Astrophoto S.L.
/**
* Estimation of the standard deviation of the noise, assuming a Gaussian
* noise distribution.
*
* - Use MRS noise evaluation when the algorithm converges for 4 >= J >= 2
*
* - Use k-sigma noise evaluation when either MRS doesn't converge or the
* length of the noise pixels set is below a 1% of the image area.
*
* - Automatically iterate to find the highest layer where noise can be
* successfully evaluated, in the [1,3] range.
*/
function NoiseEvaluation( img )
{
var a, n = 4, m = 0.01*img.bounds.area;
for ( ;; )
{
a = img.noiseMRS( n );
if ( a[1] >= m )
break;
if ( --n == 1 )
{
console.writeln( "<end><cbr>** Warning: No convergence in MRS noise evaluation routine - using k-sigma noise estimate." );
a = img.noiseKSigma();
break;
}
}
this.sigma = a[0]; // estimated stddev of Gaussian noise
this.count = a[1]; // number of pixels in the noise pixels set
this.layers = n; // number of layers used for noise evaluation
}
function main()
{
// Get access to the current active image window.
var window = ImageWindow.activeWindow;
if ( window.isNull )
throw new Error( "No active image" );
console.show();
console.writeln( "<end><cbr><br><b>" + window.currentView.fullId + "</b>" );
console.writeln( "Calculating noise standard deviation..." );
console.flush();
console.abortEnabled = true;
var img = window.currentView.image;
for ( var c = 0; c < img.numberOfChannels; ++c )
{
console.writeln( "<end><cbr><br>* Channel #", c );
console.flush();
img.selectedChannel = c;
var E = new NoiseEvaluation( img );
console.writeln( format( "σ<sub>%c</sub> = %.3e, N = %u (%.2f%%), J = %d",
img.isColor ? "RGB"[c] : 'K',
E.sigma, E.count, 100*E.count/img.bounds.area, E.layers ) );
console.flush();
}
}
main();
Basically, the problem is that for some images, the noise can only be evaluated in the first two wavelet layers (scales of one and two pixels) with the MRS algorithm. This usually happens with images plenty of significant structures at many different scales. It also happens with images where the noise has a relatively large characteristic scale, as is the case with your images. Until now, my MRS implementation tried to evaluate noise within the first four or three layers, and this was seldom causing convergence problems. Now the idea is to let the algorithm converge at the highest possible layer, from layer 3 (8 pixels) to layer 1 (2 pixels), iterating as necessary.
The implementation is much more robust with this simple modification. Unless you tell me that you see no significant improvement with the above script (which I doubt), I'll incorporate this modified implementation to ImageIntegration.