IPSDK 0.2
IPSDK : Image Processing Software Development Kit
Patch-based bilateral filter 3dSee full documentation
outImg,outParamspatchBasedBilateral3dImg (inImg)
PatchBasedBilateralParamspatchBasedBilateral3dImg (inImg,outImg)
outImg,outParamspatchBasedBilateral3dImg (inImg,params)
PatchBasedBilateralParamspatchBasedBilateral3dImg (inImg,params,outImg)

Detailed Description

Patch-based bilateral filter used to denoise a 3d image.

Patch-based bilateral filter is an algorithm used for image denoising. Like the Bilateral smoothing 3d, each voxel value is replaced by a weighted average of the values of its neighbours, and the weight is a product of two gaussian functions, one depending on the spatial distance between the 2 voxels, and the other one depending on intensity similarities. But contrary to the original version of the bilateral filter, the intensity similarity is not computed between 2 voxels, but between their 2 cubic neighbourhoods.

In term of results, this algorithm outperforms the original bilateral filter(better preservation of details and structures in the image) and gives results similar to the non-local means filter when one of the parameters, the spatial sigma, is great enough.

On output image values are given by:

\[ OutImg[x, y, z] = \dfrac { \sum_{(o_x, o_y, o_z) \in K}{W(x, y, z, o_x, o_y, o_z)*InImg[x+o_x, y+o_y, z+o_z]} } { \sum_{(o_x, o_y, o_z) \in K}{W(x, y, z, o_x, o_y, o_z)} } \]

where:

Input and output images must have same size.

Note
On a color image, the filter is applied independently to each channel of the image. There is no dedicated version of the filter for color images for the moment.

Adjusting the parameters of the filter requires some expertise. To simplify the user's task, it is possible to execute the filter in semi-automatic or in full-automatic mode:

These 2 modes usually give satisfying results, provided the noise of the input image follows a gaussian distribution. If this is not the case, using one of the 2 automatic modes may be a good starting point, but it will be certainly necessary to adjust manually the parameters afterwards.

Example of Python code :

Example imports

import PyIPSDK
import PyIPSDK.IPSDKIPLFiltering as filter
import PyIPSDK.IPSDKIPLUtility as util

Code Example

# opening of input images
inImg = PyIPSDK.loadTiffImageFile(inputImgPath)
inImg = util.convertImg(inImg, PyIPSDK.eImageBufferType.eIBT_Real32)
# patch-based bilateral filter 3d computation
outImg, autoParams = filter.patchBasedBilateral3dImg(inImg)

Example of C++ code :

Example informations

Header file

#include <IPSDKIPL/IPSDKIPLFiltering/Processor/PatchBasedBilateral3dImg/PatchBasedBilateral3dImg.h>

Code Example

// definition of a custom output geometry
ImageGeometryPtr pOutImageGeometry =
geometry3d(eImageBufferType::eIBT_Real32,
pInImg->getSizeX(),
pInImg->getSizeY(),
pInImg->getSizeZ());
// creation of output image
boost::shared_ptr<MemoryImage> pOutImg = boost::make_shared<MemoryImage>();
pOutImg->init(*pOutImageGeometry);
// compute patch-based bilateral filter on input image (output image was allocated by the user)
PatchBasedBilateralParamsPtr pOutParams = patchBasedBilateral3dImg(
pInImg,
createPatchBasedBilateralParams(inPatchHalfSize, inKernelRadius, inPatchSimilaritySigma, inSpaceSigma, inNoiseSigma),
pOutImg);