/** * Returns a denominator for filtering the wide-field, OTF band 0 with no attenuation. * * @param wParam Wiener filter parameter */ public Vec2d.Real getWidefieldDenominator(double wParam) { Vec2d.Real ret = Vec2d.createReal(sp, 2); addWienerDenominator(ret, 0, 0, false); final int w = ret.vectorWidth(), h = ret.vectorHeight(); for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) ret.set(x, y, 1 / (ret.get(x, y) + (float) (wParam * wParam))); return ret; }
/** * Returns a copy of a per-band, per-direction Wiener denominator. This is used mostly for * filtering intermediate results. * * @param d Direction * @param b Band * @param wParam Wiener filter parameter */ public Vec2d.Real getIntermediateDenominator(int d, int b, double wParam) { // get the otf Vec2d.Real ret = Vec2d.createReal(sp, 2); addWienerDenominator(ret, d, b, sp.otf().isAttenuate()); // add the wiener parameter final int w = ret.vectorWidth(), h = ret.vectorHeight(); for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) ret.set(x, y, 1 / (ret.get(x, y) + (float) (wParam * wParam))); return ret; }
/** * Setup the Wiener filter. This (re)initiates the cached filter values. Has to be called if the * OTF or the shift parameters change. */ public void updateCache() { Tool.Timer t1 = Tool.getTimer(); final int w = sp.vectorWidth(), h = sp.vectorHeight(); t1.start(); wDenom = Vec2d.createReal(2 * w, 2 * h); boolean useAtt = sp.otf().isAttenuate(); // loop directions, bands for (int d = 0; d < sp.nrDir(); d++) { for (int b = 0; b < sp.dir(d).nrBand(); b++) { addWienerDenominator(wDenom, d, b, useAtt); } } t1.stop(); Tool.trace("Wiener filter setup complete, took " + t1); }