Class AlgorithmKernelRegression
- java.lang.Object
-
- java.lang.Thread
-
- gov.nih.mipav.model.algorithms.AlgorithmBase
-
- gov.nih.mipav.model.algorithms.filters.AlgorithmKernelRegression
-
- All Implemented Interfaces:
java.awt.event.ActionListener
,java.awt.event.WindowListener
,java.lang.Runnable
,java.util.EventListener
public class AlgorithmKernelRegression extends AlgorithmBase
This is a port of MATLAB routines contained in kernelRegressionBasedImageProcessingToolBox_ver1-2beta written by Hiroyuki Takeda, Sina Farsiu, and Peyman Milanfar.
References are:
- Takeda, H., Farsiu, S., and Milanfar, P., "Kernel Regression for Image Processing and Reconstruction", IEEE Transactions on Image Processing, Vol. 16, No. 2, February, 2007, pp. 349-366.
- Takeda, H., Farsiu, S., and Milanfar, P., "Robust Kernel Regression for Restoration and Reconstruction of Images from Sparse Noisy Data", Proceedings of the International Conference on Image Processing (ICIP), Atlanta, Georgia, October, 2006.
- Takeda, H., M.S. Thesis, "Kernel Regression for Image Processing and Reconstruction", Electrical Engineering, UC Santa Cruz, March, 2006.
Convert a black and white image to a color image. Color results for RERGULARLY_SAMPLED_SECOND_ORDER classic are about as clear as the black and white results. For ITERATIVE_STEERING_KERNEL_SECOND_ORDER color results were much blurrier than the black and white results. Since here the color has R = G = B, the conversion to and from CIELab could be omitted. When this was done, then the color results were about as good as the black and white results.
6 MATLAB example files for using the routines were included in the package. 4 of the 6 files use ckr2_regular followed by a variable number of iterations of the 2 routines steering and skr2_regular. This is the method selected by ITERATIVE_STEERING_KERNEL_SECOND_ORDER. ckr2_regular and skr2_regular output estimated image, vertical gradient, horizontal gradient. Tracing thru the code shows the horizontal gradient outputs go into the zy image gradient in steering and the vertical gradient goes into the zx image gradient in steering. I maintained this order of vertical = 2 and horizontal = 1. For ITERATIVE_STEERING_KERNEL_SECOND_ORDER for 256 by 256 black and white test images consisting of only horizontal gradient, horizontal gradient plus noise, vertical gradient, vertical gradient plus noise, I tested for mean squared error between original gradient image and filtered image. Reverse order seemed best. Used Gaussian noise set at 80 in test generator. Images went from 0 at one side to 255 at the other. Mean squared errors: Horizontal gradient 1 2 0.147917 2 1 0.15333 Horizontal gradient plus noise 1 2 27.91358 2 1 31.66997 Vertical gradient 1 2 0.1627 2 1 0.152878 Vertical gradient plus noise 1 2 26.1865 2 1 29.8788 So at first it seemed that the order should be reversed to 1 2. But then I checked ITER_STEERING_KEERNEL_SECOND_ORDER with 4 iterations on 6 black and white photos with Gaussian noise = 80. cap17black.fits 256 X 256 1 2 71.088 2 1 61.555 einstein.tif 256 X 256 1 2 158.718 2 1 75.609 airfield 512 X 512 1 2 135.985 2 1 129.268 boats 512 X 512 1 2 79.584 2 1 64.735 bridge 512 X 512 1 2 157.756 2 1 138.601 0136_0002_1 library card with bar codes 1 2 235.137 2 1 80.278 So leave order as originally found. Test files corresponding to ITERATIVE_STEERING_KERNEL_SECOND_ORDER: 1.) Lena_denoise.m Denoises Gaussian noise in black and white image . 2.) Pepper_deblock.m Deblocking example in black and white image. 3.) Lena_upscale.m Upscaling. There is only 1 iteration and upscaling occurs in the final skr2_regular rather than in the initial ckr2_regular. Upscaling should only be done on the final skr2_regular. If you upscale on ckr2_regular, you will have to iterate on the larger upscaled image and processing time will be increased. 4.) JFK_denoise.m Film grain removal from color image. Note the MATLAB package converts to YCrCb whereas I convert to CIELab for better luminance separation.
ITERATIVE_STEERING_KERNEL_SECOND_ORDER_IRREGULAR uses ckr2_irregular followed by a variable number of iterations of the 2 routines steering and skr2_irregular to handle files with missing data points. The upscaling factor always = 1 for this method. Test file corresponding to ITERATIVE_STEERING_KERNEL_SECOND_ORDER_IRREGULAR: Lena_irregular.m
REGULARLY_SAMPLED_SECOND_ORDER_CLASSIC corresponds to the first routine in ITERATIVE_STEERING_KERNEL_SECOND_ORDER, ckr2_regular.
The method STEERING_KEERNEL_SECOND_ORDER_L1_NORM corresponds to: 1.) 3 X 3 median filter 2.) ckr2all_regular 3.) ckr2L1_regular 4.) steering 5.) skr2L1_regular. The test file Lena_saltpepper.m reduces salt and pepper noise in a black and white image. Note that the same upscale factor is used in ckr2all_regular, crkrL1_regular, and skr2L1_regular.
From http://users.soe.ucsc.edu/~htakeda/KernelToolBox.htm:
This is experimental software. It is provided for noncommercial research purposes only. Use at your own risk. No warranty is implied by this distribution. Copyright 2007 by University of California.
-
-
Field Summary
Fields Modifier and Type Field Description private float
alpha
The structure sensitive parameterprivate float[][][][][]
C
private float
classicStepSize
private boolean
do25D
Currently only do5D = true is implemented.private double
equalValue
private int[]
extents
private double
greaterEqualValue
private boolean
hasEqual
True if irregularly sampled data uses numbers == equalValue for missing samplesprivate boolean
hasGreaterEqual
True if irregularly sampled data uses numbers >= greaterEqualValue for missing samplesprivate boolean
hasInfinity
True if irregularly sampled data uses infinities for missing samplesprivate boolean
hasLesserEqual
True if irregularly sampled data uses numbersprivate boolean
hasNaN
True if irregularly sampled data uses NaNs for missing samplesprivate float[]
horizontalGradient
private boolean[]
I
True if data is present at a point, false if data is missing at a pointprivate float
initialGlobalSmoothing
private int
initialKernelSize
The kernel must be initialKernelSize by initialKernelSizeprivate float[]
input
private int
iterations
The total number of iterationsprivate int
iterations2
Iterations of the steepest descent method in L1 steering kernel regression in skr2L1_regular in STEERING_KERNEL_SECOND_ORDER_L1_NORMstatic int
ITERATIVE_STEERING_KERNEL_SECOND_ORDER
static int
ITERATIVE_STEERING_KERNEL_SECOND_ORDER_IRREGULAR
private float
iterativeGlobalSmoothing
private float
iterativeGlobalSmoothing2
Global smoothing parameter in skr2L1_regular in STEERING_KERNEL_SECOND_ORDER_L1_NORMprivate int
iterativeKernelSize
private float
lambda
The regularization for the elongation parameterprivate double
lesserEqualValue
private ModelImage
medianImage
private int
method
1 of 4 possible sets of routines to be executedprivate int
nDims
private float[]
output
static int
REGULARLY_SAMPLED_SECOND_ORDER_CLASSIC
private double
scaleMax
static int
STEERING_KERNEL_SECOND_ORDER_L1_NORM
private float
steeringStepSize
private int
upscale
private float[]
verticalGradient
private int
windowSize
The size of the local orientation analysis windowprivate int
xDim
private int
yDim
private int
zDim
private float[]
zInit
-
Fields inherited from class gov.nih.mipav.model.algorithms.AlgorithmBase
destFlag, destImage, image25D, mask, maxProgressValue, minProgressValue, multiThreadingEnabled, nthreads, progress, progressModulus, progressStep, runningInSeparateThread, separable, srcImage, threadStopped
-
-
Constructor Summary
Constructors Constructor Description AlgorithmKernelRegression(ModelImage destImage, ModelImage srcImg, int method, boolean hasNaN, boolean hasInfinity, boolean hasGreaterEqual, double greaterEqualValue, boolean hasEqual, double equalValue, boolean hasLesserEqual, double lesserEqualValue, float initialGlobalSmoothing, float iterativeGlobalSmoothing, float iterativeGlobalSmoothing2, int upscale, int initialKernelSize, int iterativeKernelSize, int iterations, int iterations2, int windowSize, float lambda, float alpha, float classicStepSize, float steeringStepSize, boolean do25D)
Creates a new AlgorithmKernelRegression object.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
ckr2allRegular()
Second order classic kernel regression function for regularly sampled dataprivate void
ckr2Irregular()
private void
ckr2IrregularCIELab()
private void
ckr2L1Regular()
Second order classic kernel regression function with L1-norm for regularly sampled dataprivate void
ckr2Regular(int upscale)
private void
ckr2RegularCIELab(int upscale)
private void
convertCIELabtoRGB(float[] buffer)
private void
convertRGBtoCIELab()
void
finalize()
Prepares this class for destruction.void
runAlgorithm()
Starts the nonlocal means filter algorithm.private void
skr2Irregular()
private void
skr2IrregularCIELab()
private void
skr2L1Regular()
private void
skr2Regular(int upscale)
private void
skr2RegularCIELab(int upscale)
private void
steering()
Compute steering matrices-
Methods inherited from class gov.nih.mipav.model.algorithms.AlgorithmBase
actionPerformed, addListener, addProgressChangeListener, calculateImageSize, calculatePrincipleAxis, computeElapsedTime, computeElapsedTime, convertIntoFloat, delinkProgressToAlgorithm, delinkProgressToAlgorithmMulti, displayError, errorCleanUp, fireProgressStateChanged, fireProgressStateChanged, fireProgressStateChanged, fireProgressStateChanged, fireProgressStateChanged, generateProgressValues, getDestImage, getElapsedTime, getMask, getMaxProgressValue, getMinProgressValue, getNumberOfThreads, getProgress, getProgressChangeListener, getProgressChangeListeners, getProgressModulus, getProgressStep, getProgressValues, getSrcImage, isCompleted, isImage25D, isMultiThreadingEnabled, isRunningInSeparateThread, isThreadStopped, linkProgressToAlgorithm, linkProgressToAlgorithm, makeProgress, notifyListeners, removeListener, removeProgressChangeListener, run, setCompleted, setImage25D, setMask, setMaxProgressValue, setMinProgressValue, setMultiThreadingEnabled, setNumberOfThreads, setProgress, setProgressModulus, setProgressStep, setProgressValues, setProgressValues, setRunningInSeparateThread, setSrcImage, setStartTime, setThreadStopped, startMethod, windowActivated, windowClosed, windowClosing, windowDeactivated, windowDeiconified, windowIconified, windowOpened
-
Methods inherited from class java.lang.Thread
activeCount, checkAccess, clone, countStackFrames, currentThread, dumpStack, enumerate, getAllStackTraces, getContextClassLoader, getDefaultUncaughtExceptionHandler, getId, getName, getPriority, getStackTrace, getState, getThreadGroup, getUncaughtExceptionHandler, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, join, join, join, onSpinWait, resume, setContextClassLoader, setDaemon, setDefaultUncaughtExceptionHandler, setName, setPriority, setUncaughtExceptionHandler, sleep, sleep, start, stop, suspend, toString, yield
-
-
-
-
Field Detail
-
REGULARLY_SAMPLED_SECOND_ORDER_CLASSIC
public static final int REGULARLY_SAMPLED_SECOND_ORDER_CLASSIC
- See Also:
- Constant Field Values
-
ITERATIVE_STEERING_KERNEL_SECOND_ORDER
public static final int ITERATIVE_STEERING_KERNEL_SECOND_ORDER
- See Also:
- Constant Field Values
-
ITERATIVE_STEERING_KERNEL_SECOND_ORDER_IRREGULAR
public static final int ITERATIVE_STEERING_KERNEL_SECOND_ORDER_IRREGULAR
- See Also:
- Constant Field Values
-
STEERING_KERNEL_SECOND_ORDER_L1_NORM
public static final int STEERING_KERNEL_SECOND_ORDER_L1_NORM
- See Also:
- Constant Field Values
-
method
private final int method
1 of 4 possible sets of routines to be executed
-
hasNaN
private final boolean hasNaN
True if irregularly sampled data uses NaNs for missing samples
-
hasInfinity
private final boolean hasInfinity
True if irregularly sampled data uses infinities for missing samples
-
hasGreaterEqual
private final boolean hasGreaterEqual
True if irregularly sampled data uses numbers >= greaterEqualValue for missing samples
-
greaterEqualValue
private final double greaterEqualValue
-
hasEqual
private final boolean hasEqual
True if irregularly sampled data uses numbers == equalValue for missing samples
-
equalValue
private final double equalValue
-
hasLesserEqual
private final boolean hasLesserEqual
True if irregularly sampled data uses numbers-
lesserEqualValue
private final double lesserEqualValue
-
initialGlobalSmoothing
private final float initialGlobalSmoothing
-
iterativeGlobalSmoothing
private final float iterativeGlobalSmoothing
-
iterativeGlobalSmoothing2
private final float iterativeGlobalSmoothing2
Global smoothing parameter in skr2L1_regular in STEERING_KERNEL_SECOND_ORDER_L1_NORM
-
upscale
private final int upscale
-
initialKernelSize
private final int initialKernelSize
The kernel must be initialKernelSize by initialKernelSize
-
iterativeKernelSize
private final int iterativeKernelSize
-
iterations
private final int iterations
The total number of iterations
-
iterations2
private final int iterations2
Iterations of the steepest descent method in L1 steering kernel regression in skr2L1_regular in STEERING_KERNEL_SECOND_ORDER_L1_NORM
-
windowSize
private int windowSize
The size of the local orientation analysis window
-
lambda
private final float lambda
The regularization for the elongation parameter
-
alpha
private final float alpha
The structure sensitive parameter
-
classicStepSize
private final float classicStepSize
-
steeringStepSize
private final float steeringStepSize
-
do25D
private boolean do25D
Currently only do5D = true is implemented.
-
nDims
private int nDims
-
output
private float[] output
-
horizontalGradient
private float[] horizontalGradient
-
verticalGradient
private float[] verticalGradient
-
extents
private int[] extents
-
xDim
private int xDim
-
yDim
private int yDim
-
zDim
private int zDim
-
C
private float[][][][][] C
-
I
private boolean[] I
True if data is present at a point, false if data is missing at a point
-
input
private float[] input
-
medianImage
private ModelImage medianImage
-
zInit
private float[] zInit
-
scaleMax
private double scaleMax
-
Constructor Detail
-
AlgorithmKernelRegression
public AlgorithmKernelRegression(ModelImage destImage, ModelImage srcImg, int method, boolean hasNaN, boolean hasInfinity, boolean hasGreaterEqual, double greaterEqualValue, boolean hasEqual, double equalValue, boolean hasLesserEqual, double lesserEqualValue, float initialGlobalSmoothing, float iterativeGlobalSmoothing, float iterativeGlobalSmoothing2, int upscale, int initialKernelSize, int iterativeKernelSize, int iterations, int iterations2, int windowSize, float lambda, float alpha, float classicStepSize, float steeringStepSize, boolean do25D)
Creates a new AlgorithmKernelRegression object.- Parameters:
destImage
- denoised imagesrcImg
- 2D or 3D source imagemethod
- 1 of 4 possible sets of routines to be executedhasNaN
- true if irregularly sampled data uses NaN for missing valueshasInfinity
- true if irregularly sampled data uses infinity for missing valueshasGreaterEqual
- true if irregularly sampled data uses values >= greaterEqualValue for missing valuesgreaterEqualValue
-hasEqual
- true if irregularly sampled data uses values == equalValue for missing valuesequalValue
-hasLesserEqual
- true if irregularly sampled data uses valueslesserEqualValue
-initialGlobalSmoothing
-iterativeGlobalSmoothing
-iterativeGlobalSmoothing2
- Global smoothing in L1 steering kernel regressionupscale
- Upscaling factorinitialKernelSize
-iterativeKernelSize
-iterations
- Total number of iterationsiterations2
- Iterations in L1 steering kernel regressionwindowSize
- Size of the local orientation analysis windowlambda
- Regularization for the elongation parameteralpha
- Structure sensitive parameterclassicStepSize
-steeringStepSize
-do25D
- If true, do slice by slice filtering
-
-
Method Detail
-
finalize
public void finalize()
Prepares this class for destruction.- Overrides:
finalize
in classAlgorithmBase
-
runAlgorithm
public void runAlgorithm()
Starts the nonlocal means filter algorithm.- Specified by:
runAlgorithm
in classAlgorithmBase
-
ckr2Regular
private void ckr2Regular(int upscale)
-
ckr2Irregular
private void ckr2Irregular()
-
ckr2IrregularCIELab
private void ckr2IrregularCIELab()
-
ckr2L1Regular
private void ckr2L1Regular()
Second order classic kernel regression function with L1-norm for regularly sampled data
-
ckr2allRegular
private void ckr2allRegular()
Second order classic kernel regression function for regularly sampled data
-
ckr2RegularCIELab
private void ckr2RegularCIELab(int upscale)
-
steering
private void steering()
Compute steering matrices
-
skr2Regular
private void skr2Regular(int upscale)
-
skr2Irregular
private void skr2Irregular()
-
skr2IrregularCIELab
private void skr2IrregularCIELab()
-
skr2L1Regular
private void skr2L1Regular()
-
skr2RegularCIELab
private void skr2RegularCIELab(int upscale)
-
convertRGBtoCIELab
private void convertRGBtoCIELab()
-
convertCIELabtoRGB
private void convertCIELabtoRGB(float[] buffer)
-
-
-
-