IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
Variational Stationary Noise Remover 2D

Variational Stationary Noise Remover. More...

IPSDKIPLFILTERING_API VSNRResult ipsdk::imaproc::filter::vsnr2dImg (const image::ImageConstPtr &pInImg, const ipUInt32 nbIter, const ipReal32 stdDevX, const ipReal32 stdDevY, const ipReal32 theta, const ipReal64 alpha)
 wrapper function for Variational Stationary Noise Remover More...
 
IPSDKIPLFILTERING_API void ipsdk::imaproc::filter::vsnr2dImg (const image::ImageConstPtr &pInImg, const ipUInt32 nbIter, const ipReal32 stdDevX, const ipReal32 stdDevY, const ipReal32 theta, const ipReal64 alpha, const image::ImagePtr &pOutCorrectedImg, const image::ImagePtr &pOutNoiseImg)
 wrapper function for Variational Stationary Noise Remover More...
 
IPSDKIPLFILTERING_API VSNRResult ipsdk::imaproc::filter::vsnr2dImg (const image::ImageConstPtr &pInImg, const image::ImageConstPtr &pNoiseImg, const ipUInt32 nbIter, const ipReal64 alpha)
 wrapper function for Variational Stationary Noise Remover More...
 
IPSDKIPLFILTERING_API void ipsdk::imaproc::filter::vsnr2dImg (const image::ImageConstPtr &pInImg, const image::ImageConstPtr &pNoiseImg, const ipUInt32 nbIter, const ipReal64 alpha, const image::ImagePtr &pOutCorrectedImg, const image::ImagePtr &pOutNoiseImg)
 wrapper function for Variational Stationary Noise Remover More...
 

Detailed Description

Variational Stationary Noise Remover.

Standard denoising methods rely on a white noise assumption. This means that the intensity alteration is spatially uncorrelated. The VSNR (Variational Stationary Noise Remover) algorithm removes structural noise, i.e. following a pattern, in the input image [1].

In a generic case, we can express the noisy image $I$ as the sum of the clean image $I_0$ and the noise image $I_N$ :

\[ I = I_0 + I_N \]

In the case of stationary noise $I_N$ can be expressed as the convolution of white noise $ \lambda $ with a pattern $ \psi $:

\[ I_N = \sum_{i=1}^{n}{ \lambda_i * \psi_i} \]

where $ * $ is the convolution operator.

In this IPSDK implementation, noise the pattern $ \psi $ can be provided as an input image or can be expressed as an oriented Gabor function, by providing the Gabor parameters:

\[ g(x, y) = \exp \left( -\frac{x'^2}{2 \sigma_x^2} - \frac{y'^2}{2 \sigma_y^2} \right) \]

Where $ (x', y') $ are the coordinates after a rotation of $ \theta $:

\[ x' = x \cos( \theta ) + y \sin( \theta ) \]

\[ y' = -x \sin( \theta ) + y \cos( \theta ) \]

Note
In the case of parametrized Gabor pattern, the input parameter InTheta is expressed in degrees.

This is an example of noie image according $I_N$ to a Gabor pattern $\psi$ with an orientation of 45° and a white noise $\lambda$ :

VSNR2D_NoiseImageIllustration.png

The noise image estimation can be estimated by iteratively solving the following optimization problem:

\[ P(\lambda) = \left\| \nabla \left( I_N - \sum_{i=1}^{m}{\lambda_i * \psi_i} \right) \right\|_{1, \epsilon} + \sum_{i=1}^{m}{\phi(\lambda_i)} \]

Where $\phi(\lambda)$ is the regularization term.

Please, see [1] for more details.

Here is an example of VSNR filtering result:

VSNR2D_Result.png

[1] Variational algorithms to remove stationary noise. Application to microscopy imaging. J. Fehrenbach, P. Weiss and C. Lorenzo, IEEE Image Processing Vol. 21, Issue 10, pages 4420 - 4430, October (2012)

Attributes description

Attribute description for algorithm :

Name ToolTip Default Initializer
ipsdk::imaproc::attr::InImg [Input] image for processing operation X
ipsdk::imaproc::attr::InOptImg1 [Input Optional] first input image for operation X
ipsdk::imaproc::attr::InNbIter [Input] Number of iterations for an iterative algorithm X
ipsdk::imaproc::attr::InOptGaborParams [Input Optional] Parameters to generate a Gabor signal X
ipsdk::imaproc::attr::InFactor [Input] Multiplying factor. Used for instance by shading correction algorithm X
ipsdk::imaproc::attr::OutOptWk1Img [Output Optional] Temporary working image for algorithm X
ipsdk::imaproc::attr::OutWk1RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk1RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk2RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk2RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk3RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk3RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk4RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk4RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk5RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk5RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk6RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk6RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk7RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk7RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk8RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk8RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk9RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk9RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk10RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk10RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk11RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk11RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk12RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk12RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk13RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk13RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk14RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk14RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk15RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk15RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk16RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk16RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk17RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk17RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk18RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk18RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk19RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk19RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk20RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk20RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk21RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk21RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk22RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk22RealImg, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutImg1 [Output] First output image ipsdk::imaproc::duplicateInOut (_pOutImg1, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutImg2 [Output] Second output image ipsdk::imaproc::duplicateInOut (_pOutImg2, _pInImg, ipsdk::image::eImageBufferType::eIBT_Real32)

Global Rule description

Global rule description for algorithm :
ipsdk::imaproc::matchSize (_pInImg,_pOutImg1) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutImg2) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk1RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk2RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk3RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk4RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk5RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk6RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk7RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk8RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk9RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk10RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk11RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk12RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk13RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk14RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk15RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk16RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk17RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk18RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk19RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk20RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk21RealImg) && 
ipsdk::imaproc::matchSize (_pInImg,_pOutWk22RealImg) && 
ipsdk::processor::ifIsSet (_pInOptImg1,
 ipsdk::imaproc::matchSize (_pInImg,_pInOptImg1))

Example of Python code :

Example imports

import PyIPSDK
import PyIPSDK.IPSDKIPLFiltering as filter

Code Example

# opening of input images
inImg = PyIPSDK.loadTiffImageFile(inputImgPath)
# unsharp mask 2d computation
outImg, noiseImg = filter.vsnr2dImg(inImg, 12, 1, 30, 0, 1)

Example of C++ code :

Example informations

Associated library

IPSDKIPLFiltering

Header file

Code Example

// compute median on input image
VSNRResult result = vsnr2dImg(pInImg, 12, 1.f, 30.f, 0.f, 1.f);
See also
VSNR2dImgLvl1

Function Documentation

◆ vsnr2dImg() [1/4]

IPSDKIPLFILTERING_API VSNRResult ipsdk::imaproc::filter::vsnr2dImg ( const image::ImageConstPtr pInImg,
const ipUInt32  nbIter,
const ipReal32  stdDevX,
const ipReal32  stdDevY,
const ipReal32  theta,
const ipReal64  alpha 
)

wrapper function for Variational Stationary Noise Remover

Exceptions
ipsdk::processor::IPSDKBaseProcessingExceptionon failure

◆ vsnr2dImg() [2/4]

IPSDKIPLFILTERING_API void ipsdk::imaproc::filter::vsnr2dImg ( const image::ImageConstPtr pInImg,
const ipUInt32  nbIter,
const ipReal32  stdDevX,
const ipReal32  stdDevY,
const ipReal32  theta,
const ipReal64  alpha,
const image::ImagePtr pOutCorrectedImg,
const image::ImagePtr pOutNoiseImg 
)

wrapper function for Variational Stationary Noise Remover

Exceptions
ipsdk::processor::IPSDKBaseProcessingExceptionon failure

◆ vsnr2dImg() [3/4]

IPSDKIPLFILTERING_API VSNRResult ipsdk::imaproc::filter::vsnr2dImg ( const image::ImageConstPtr pInImg,
const image::ImageConstPtr pNoiseImg,
const ipUInt32  nbIter,
const ipReal64  alpha 
)

wrapper function for Variational Stationary Noise Remover

Exceptions
ipsdk::processor::IPSDKBaseProcessingExceptionon failure

◆ vsnr2dImg() [4/4]

IPSDKIPLFILTERING_API void ipsdk::imaproc::filter::vsnr2dImg ( const image::ImageConstPtr pInImg,
const image::ImageConstPtr pNoiseImg,
const ipUInt32  nbIter,
const ipReal64  alpha,
const image::ImagePtr pOutCorrectedImg,
const image::ImagePtr pOutNoiseImg 
)

wrapper function for Variational Stationary Noise Remover

Exceptions
ipsdk::processor::IPSDKBaseProcessingExceptionon failure