Giter Site home page Giter Site logo

insightsoftwareconsortium / itkisotropicwavelets Goto Github PK

View Code? Open in Web Editor NEW
13.0 6.0 11.0 2.02 MB

External Module for ITK, implementing Isotropic Wavelets and Riesz Filter for multiscale phase analysis.

License: Apache License 2.0

CMake 3.14% C++ 96.48% Python 0.38%
itk wavelet pyramid phase-analysis signal-analysis steerable-wavelets mra itk-module

itkisotropicwavelets's Introduction

ITKIsotropicWavelets

image

Overview

DOI

External Module for ITK, implementing Isotropic Wavelets and Riesz Filter for multiscale phase analysis.

This document describes the implementation of the external module ITKIsotropicWavelets, a multiresolution (MRA) analysis framework using isotropic and steerable wavelets in the frequency domain. This framework provides the backbone for state of the art filters for denoising, feature detection or phase analysis in N-dimensions. It focuses on reusability, and highly decoupled modules for easy extension and implementation of new filters, and it contains a filter for multiresolution phase analysis.

The backbone of the multi-scale analysis is provided by an isotropic band-limited wavelet pyramid, and the detection of directional features is provided by coupling the pyramid with a generalized Riesz transform.

The generalized Riesz transform of order N behaves like a smoothed version of the Nth order derivatives of the signal. Also, it is steerable: its components' impulse responses can be rotated to any spatial orientation, reducing computation time when detecting directional features.

For more information, see the Insight Journal article:

Hernandez-Cerdan P.
Isotropic and Steerable Wavelets in N Dimensions. A multiresolution analysis framework
The Insight Journal. January-December. 2016.
https://hdl.handle.net/10380/3588
https://www.insight-journal.org/browse/publication/986

Cite with:

P. Hernandez-Cerdan, “Isotropic and Steerable Wavelets in N Dimensions. A multiresolution analysis framework for ITK,” arXiv:1710.01103 [cs], Oct. 2017.

Installation

In C++:

You need to build ITK from source to use this module.

Since ITK version 4.13, this module is available as a Remote module in the ITK source code.

Build it with the CMake option: Module_IsotropicWavelets, this can be switched on with a CMake graphical interface ccmake or directly from the command line with: -DModule_IsotropicWavelets:BOOL=ON

For older ITK versions (>4.10 required if BUILD_TEST=ON), add it manually as an External or Remote module to the ITK source code.

External:

cd ${ITK_SOURCE_CODE}/Modules/External
git clone https://github.com/phcerdan/ITKIsotropicWavelets

Remote:

Or create a file in ${ITK_SOURCE_CODE}/Modules/Remote called IsotropicWavelets.remote.cmake (already there in ITK-4.13) with the content:

itk_fetch_module(IsotropicWavelets
  "IsotropicWavelets Extenal Module."
  GIT_REPOSITORY https://github.com/phcerdan/ITKIsotropicWavelets
  GIT_TAG master
  )

Python

In Python:

pip install itk-isotropicwavelets

Components

  • [x] Steerable Pyramid in the frequency domain.
  • [x] Undecimated Steerable Pyramid.
  • [x] Generalized Riesz Filter Bank of order N (smoothed derivatives)
  • [x] Steering framework (RieszRotationMatrix).
    • [NA] General case, U matrix from Chenouard, Unser.
    • [NA] Simoncelli Equiangular case.
  • [x] FrequencyBandImageFilter.
  • [x] Monogenic Signal Phase Analysis.
    • Reproduces Held work as a brightness equalizator / local phase detector.
  • [x] Simoncelli, Shannon, Held and Vow Isotropic Wavelets.
  • [x] Shrinker and Expander in spatial domain with no interpolation.
  • [x] StructureTensor.
  • [x] Simple test to every wavelet (Vow, Held, Simoncelli, Shannon), instead of relying on the implicit testing with the WaveletBankGenerator.

The work is inspired by the monogenic signal from literature, that uses wavelets and riesz filter to provide a multiscale denoise and segmentation mechanism.

The Riesz filter is a Hilbert transform for ND, that provides phase information, ie feature detection, in every dimension.

Wavelets are really important in signal analysis, they are able to perform a multiscale analysis of a signal. Similar to a windowed Fourier Transform, but with the advantage that the spatial resolution (the window) can be modulated, retaining more information from the original image.

In this implementation only isotropic wavelets are considered. These are wavelets that depend on the modulo of the frequency vector. There are not many mother isotropic wavelets developed in the literature, I implemented 4 of them here from respective papers (see specific docs for more information). The main advantage of isotropic wavelets is that they are steerable, as shown by Simoncelli, steering the wavelet at each location provides adaptability to different signal, and can be used along PCA methods to select the best matching "steer" at each location and scale.

Input to filters in this module needs to be in the dual space (frequency). For example, from the output of an forward FFT. The decision is made to avoid performing multiple FFT.

Also a FrequencyShrinker and an Expander WITHOUT any interpolation, just chopping and adding zeros have been added.

Because the layout of the frequencies after an FFT is implementation dependent (FFTW and VNL should share the same layout, but Python FFT might be different, etc.), I added an iterator to abstract this layout. It has a function GetFrequencyIndex(), that facilitates implementation of further frequency filters.

Right now this iterator has been tested with the option ITK_USES_FFTW, but should work for the default VNL.

Summary of components and files:

Frequency Iterators

itkFrequencyImageRegionConstIteratorWithIndex.h
itkFrequencyImageRegionIteratorWithIndex.h
itkFrequencyFFTLayoutImageRegionConstIteratorWithIndex.h
itkFrequencyFFTLayoutImageRegionIteratorWithIndex.h
itkFrequencyShiftedFFTLayoutImageRegionConstIteratorWithIndex.h
itkFrequencyShiftedFFTLayoutImageRegionIteratorWithIndex.h

FrequencyFunctions

Base and Derived Classes

  • itkFrequencyFunction.h
    • itkIsotropicFrequencyFunction.h
      • itkIsotropicWaveletFrequencyFunction.h itkIsotropicWaveletFrequencyFunction.hxx

Wavelets Functions (IsotropicWaveletFrequencyFunction)

itkHeldIsotropicWavelet.h
itkHeldIsotropicWavelet.hxx

itkSimoncelliIsotropicWavelet.h
itkSimoncelliIsotropicWavelet.hxx

itkShannonIsotropicWavelet.h
itkShannonIsotropicWavelet.hxx

itkVowIsotropicWavelet.h
itkVowIsotropicWavelet.hxx

Wavelets Generators (use functions to create ImageSources)

itkWaveletFrequencyFilterBankGenerator.h
itkWaveletFrequencyFilterBankGenerator.hxx

Riesz Function (FrequencyFunction)

itkRieszFrequencyFunction.h
itkRieszFrequencyFunction.hxx

Riesz Generator (use functions to create ImageSources)

itkRieszFrequencyFilterBankGenerator.h
itkRieszFrequencyFilterBankGenerator.hxx

Frequency Expand/Shrinkers

itkFrequencyExpandImageFilter.h
itkFrequencyExpandImageFilter.hxx
itkFrequencyShrinkImageFilter.h
itkFrequencyShrinkImageFilter.hxx

itkFrequencyExpandViaInverseFFTImageFilter.h
itkFrequencyExpandViaInverseFFTImageFilter.hxx
itkFrequencyShrinkViaInverseFFTImageFilter.h
itkFrequencyShrinkViaInverseFFTImageFilter.hxx

MonogenicSignal Filter (Riesz Function in all dimensions)

itkMonogenicSignalFrequencyImageFilter.h
itkMonogenicSignalFrequencyImageFilter.hxx

FrequencyBand Filter (pass or stop freq band)

itkFrequencyBandImageFilter.h
itkFrequencyBandImageFilter.hxx

Forward/Inverse Wavelet (ImageFilter, apply wavelet pyramid using generators)

Decimated

itkWaveletFrequencyForward.h
itkWaveletFrequencyForward.hxx

itkWaveletFrequencyInverse.h
itkWaveletFrequencyInverse.hxx

Undecimated

itkWaveletFrequencyForwardUndecimated.h
itkWaveletFrequencyForwardUndecimated.hxx

itkWaveletFrequencyInverseUndecimated.h
itkWaveletFrequencyInverseUndecimated.hxx

Wavelet independent

Local estimator over a neighborhood. Get the linear combination of inputs that maximize the response at every pixel.

itkStructureTensor.h
itkStructureTensor.hxx

Regular shrinkers without interpolation

itkExpandWithZerosImageFilter.h
itkExpandWithZerosImageFilter.hxx
itkShrinkDecimateImageFilter.h
itkShrinkDecimateImageFilter.hxx

Wrappers without new functionality

itkVectorInverseFFTImageFilter.h
itkVectorInverseFFTImageFilter.hxx

itkZeroDCImageFilter.h
itkZeroDCImageFilter.hxx

Helpers (Linear index to subindex array)

itkInd2Sub.h

Phase Analysis

itkPhaseAnalysisImageFilter.h
itkPhaseAnalysisImageFilter.hxx

itkPhaseAnalysisSoftThresholdImageFilter.h
itkPhaseAnalysisSoftThresholdImageFilter.hxx

Riesz Rotation Matrix (Steerable Matrix)

itkRieszRotationMatrix.h
itkRieszRotationMatrix.hxx

itkRieszUtilities.h
itkRieszUtilities.cxx

License

This software is distributed under the Apache 2.0 license. Please see the LICENSE file for details.

itkisotropicwavelets's People

Contributors

cramraj8 avatar dzenanz avatar fbudin69500 avatar hjmjohnson avatar jhlegarreta avatar mseng10 avatar phcerdan avatar pranjalsahu avatar sadhana-r avatar tbirdso avatar thewtex avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

itkisotropicwavelets's Issues

Python Wrapping errors with ITK v5.1.1

We are unable to run Python Wrapping for ITKIsotropicWavelets without wrapping errors. The terminal output is provided below when ran in the following conditions:

  • Ubuntu 18.04.5
  • ITK v5.1.1
  • Python 3.5.9

Screen Shot 2020-08-26 at 11 11 23 AM

These errors are consistent amongst MacOS and Windows builds as well. I have provided a link to all 3 failing builds here. This issue will require the following changes:

  • Fix Python Wrapping for Ubuntu, Windows and MacOS.
  • Create PR containing wrapping changes and uncomment Python Package Builds in GitHub Actions CI with TODO removed. Verify all Python Packages build correctly.
  • Create an API token on PyPI for the package, and put in the repository Settings -> Secrets under the key pypi_password.
  • Create new Git tag, either locally and pushing, or in the GitHub web Release page, this will trigger builds and push the packages to PyPI.

Exercise exceptions in tests

A number of exceptions are caught in the classes. Tests should include cases to check these exceptions through the TRY_EXPECT_EXCEPTION( command ); sentence.

Tag a new version

Version number was incremented by f33b5e9 in anticipation of tagging v0.6.1. As there is some PR activity going on, we should tag after it finishes. But before that, we should add PyPI token as per Matthew so the new binaries are automatically uploaded.

BUG: compile error when building with BUILD_TESTING ON

Error generated:

/path/to/ITK/Modules/Filtering/FFT/include/itkFFTWGlobalConfiguration.h:31:10: fatal error: 'fftw3.h' file not found
#include "fftw3.h"
         ^
1 error generated.
make[2]: *** [CMakeFiles/IsotropicWaveletsHeaderTest1.dir/test/IsotropicWaveletsHeaderTest1.cxx.o] Error 1

Steps to reproduce:

  • Build ITK with ITK_USE_FFTWF ON, ITK_USE_FFTWD ON and ITK_USE_SYSTEM_FFTW OFF
  • Keep BUILD_TESTING ON in ITKIsotropicWavelets module CMake configuration
  • make

Rename current StructureTensor, append ImageFilter

@jhlegarreta raised in #56 that the current StructureTensor name is misleading.

It is a filter that computes a Structure Tensor per pixel but also computes the eigensystem of the tensor. It outputs a matrix with the eigenvectors and eigenvalues per pixel

We should:

  • Rename it to someting involving ImageFilter: itkStructureTensorEigenSystemImageFilter maybe?

  • Refactor out of the current filter the computation of the StructureTensor. The new class, named correctly itkStructureTensor, will only compute the tensor.

For more info about the tensor:
StructureTensor in wikipedia. The input there is a function I, they calculate its gradient, and do a eigensystem analysis. Here is the same framework but the input is instead a vector of images, not a function (could be a vector with directional derivatives --the gradient--, or the Riesz responses, or any other directional measurements).

In the current ImageFilter we do this calculation for every pixel, and could be slow for large number of inputs, see #61.

How to convert a “Swig Object of type 'itkImageCF3_Pointer *'” into a “itk.itkImagePython.itkImageCF3”

I try to port the examples/runRieszWaveletAnalysis.cpp from C++ to python. And part of the code is as foloows

#********************************************************************************
# FFT padding
#********************************************************************************
import itk
import numpy as np
import nibabel as nib
import os

#********************************************************************************
# Types
#********************************************************************************
# parametres
Dimension = 3
highSubBands = 4
levels = 4
ImageType = itk.Image[itk.F, Dimension]
ComplexImageType = itk.Image[itk.complex[itk.F], Dimension]

#********************************************************************************
# image data
#********************************************************************************
# image volume
image_volume = np.random.rand(900, 900, 900).astype(np.float32)
input_volume = image_volume.astype(np.float32)
input_volume_itk = itk.GetImageFromArray(np.ascontiguousarray(input_volume))

#********************************************************************************
# FFT padding
#********************************************************************************
BoundaryConditionType = itk.ConstantBoundaryCondition[ImageType]
bounds = BoundaryConditionType()
bounds.SetConstant(itk.NumericTraits[itk.F].ZeroValue())

FFTPadFilterType = itk.FFTPadImageFilter[ImageType]
fftPadFilter = FFTPadFilterType.New()
fftPadFilter.SetInput(input_volume_itk)
fftPadFilter.SetBoundaryCondition(bounds)
fftPadFilter.Update()

input_volume_itk_padded = fftPadFilter.GetOutput()
# input_volume_itk_padding.GetLargestPossibleRegion().GetSize()

#********************************************************************************
# IsotropicWavelet
#********************************************************************************
# Generate data in frequency domain for IsotropicWavelet by FFT
FFTForwardFilterType = itk.ForwardFFTImageFilter[ImageType, ComplexImageType]
fftForwardFilter = FFTForwardFilterType.New()
fftForwardFilter.SetInput(input_volume_itk_padded)
fftForwardFilter.Update()
# InverseFFTFilterType = itk.InverseFFTImageFilter[ComplexImageType, ImageType]
output_volume_fft = fftForwardFilter.GetOutput()

# Construct ShannonIsotropicWavelet
WaveletType = itk.ShannonIsotropicWavelet[itk.F, Dimension,
                                          itk.Point[itk.D, Dimension]]
WaveletFilterBankType = itk.WaveletFrequencyFilterBankGenerator[ComplexImageType,
                                        WaveletType].New()
ForwardWaveletType = itk.WaveletFrequencyForward[ComplexImageType,
                                                 ComplexImageType, WaveletFilterBankType]
forwardWavelet = ForwardWaveletType.New()

# ShannonIsotropicWavelet transform
forwardWavelet.SetHighPassSubBands( highSubBands )
forwardWavelet.SetLevels( levels )
forwardWavelet.SetInput(output_volume_fft)
forwardWavelet.Update()
analysisWavelets = forwardWavelet.GetOutputs()

# Apply Monogenic signal to wavelet results
MonogenicSignalFrequencyFilterType = itk.MonogenicSignalFrequencyImageFilter[ComplexImageType]
VectorMonoOutputType = itk.VectorImage[itk.complex[itk.F], Dimension]
VectorInverseFFTType = itk.VectorInverseFFTImageFilter[VectorMonoOutputType, itk.VectorImage[itk.F, Dimension]]
PhaseAnalysisFilter = itk.PhaseAnalysisSoftThresholdImageFilter[itk.VectorImage[itk.F, Dimension], itk.Image[itk.F, Dimension]]

numberOfOutputs = forwardWavelet.GetNumberOfOutputs()
for i in range(numberOfOutputs):
    print('Output #: ' + str(i) + ' / ' + str(numberOfOutputs - 1))
    monoFilter = MonogenicSignalFrequencyFilterType.New()
    vecInverseFFT = VectorInverseFFTType.New()
    phaseAnalyzer = PhaseAnalysisFilter.New()
    fftForwardPhaseFilter = FFTForwardFilterType.New()

    # Generate a monogenic signal (vector valued)
    monoFilter.SetInput(analysisWavelets[i])
    monoFilter.Update()

    vecInverseFFT.SetInput( monoFilter.GetOutput() )
    vecInverseFFT.Update()

    phaseAnalyzer.SetInput( vecInverseFFT.GetOutput() );
    phaseAnalyzer.SetApplySoftThreshold( applySoftThreshold );

There is a type mismatching in

monoFilter.SetInput(analysisWavelets[i])

In python2.7 the error message is

*** TypeError: in method 'itkImageToImageFilterICF3VICF3_SetInput', argument 2 of type 'itkImageCF3 const *'

And in python3.6 the error message is

*** TypeError: in method 'itkImageToImageFilterICF3VICF3_SetInput', argument 2 of type 'itkImageCF3 const *'
Additional information:
Wrong number or type of arguments for overloaded function 'itkImageToImageFilterICF3VICF3_SetInput'.
  Possible C/C++ prototypes are:
    itkImageToImageFilterICF3VICF3::SetInput(itkImageCF3 const *)
    itkImageToImageFilterICF3VICF3::SetInput(unsigned int,itkImageCF3 const *)

It seems “itkImageToImageFilterICF3VICF3::SetInput” needs an argument of type “itkImageCF3 const *”, but the “analysisWavelets[i]” is a “Swig Object of type 'itkImageCF3_Pointer *'”. Is there a convertion from a “Swig Object of type 'itkImageCF3_Pointer *'” to a “itkImageCF3 const *”, or other ways?

Warnings in MacOS (Wundefined-var-template)

Only in clang.

https://open.cdash.org/viewBuildError.php?type=1&buildid=5772807

Modules/Core/Common/include/itkNumericTraits.h:1083:36: warning: instantiation of variable 'itk::NumericTraits<std::__1::complex<double> >::Zero' required here, but no definition is available [-Wundefined-var-template]
  static Self ZeroValue() { return Zero; }
Modules/Core/Common/include/itkNumericTraits.h:1083:36: note: add an explicit instantiation declaration to suppress this warning if 'itk::NumericTraits<std::__1::complex<double> >::Zero' is explicitly instantiated in another translation unit

  static Self ZeroValue() { return Zero; }

This is related to the numeric traits of complex types:

https://github.com/InsightSoftwareConsortium/ITK/blob/c06eb6859b561ae1fb7aca8149e46769cbfe6e99/Modules/Core/Common/include/itkNumericTraits.h#L1062-L1089

Configure time warnings with wrappings

This module works a lot with std::complex , and in StructureTensor each pixel is very small image.

Those cases are not wrapped in ITK, so some API won't be accessible from python.

Generated at configure time with wrappings enabled:

Generating /path/../IsotropicWavelets_snake_case.py
itkMatrixComplex: warning(4): ITK type not wrapped, or currently not known: itk::Vector< std::complex< float >, 2 >
itkMatrixComplex: warning(4): ITK type not wrapped, or currently not known: itk::Point< std::complex< float >, 2 >
itkMatrixComplex: warning(4): ITK type not wrapped, or currently not known: itk::CovariantVector< std::complex< float >, 2 >
itkMatrixComplex: warning(4): ITK type not wrapped, or currently not known: itk::Vector< std::complex< float >, 3 >
itkMatrixComplex: warning(4): ITK type not wrapped, or currently not known: itk::Point< std::complex< float >, 3 >
itkMatrixComplex: warning(4): ITK type not wrapped, or currently not known: itk::CovariantVector< std::complex< float >, 3 >
itkVariableSizeMatrixComplex: warning(4): ITK type not wrapped, or currently not known: itk::Array< std::complex< float > >
itkStructureTensor: warning(4): ITK type not wrapped, or currently not known: itk::GaussianImageSource< itk::Image< double, 3 > >
itkRieszRotationMatrix: warning(4): ITK type not wrapped, or currently not known: itk::Array< std::complex< double > >

Check that algorithm is applied on image borders.

CarrKbin1_1792_4x4x1_tile_1.nrrd.tar.gz

imageInfo:

Pixel Type is unsigned_char
numDimensions: 3
component size: 1
pixel type (string): scalar
pixel type: 1
NrrdImageIO (0x5632bbf59ec0)
  RTTI typeinfo:   itk::NrrdImageIO
  Reference Count: 1
  Modified Time: 190
  Debug: Off
  Object Name:
  Observers:
    none
  AbortGenerateData: Off
  Progress: 0
  FileName: /home/phc/repository_local/network-graph/results/Carrageenan/CarrKbin1_1792_4x4x1_tile_1.nrrd
  FileType: Binary
  ByteOrder: OrderNotApplicable
  IORegion:
    ImageIORegion (0x5632bbf59f58)
      Dimension: 2
      Index: 0 0
      Size: 0 0
  Number of Components/Pixel: 1
  Pixel Type: scalar
  Component Type: unsigned_char
  Dimensions: ( 448 448 64 )
  Origin: ( 89 89 14 )
  UseCompression: Off
  UseStreamedReading: Off
  UseStreamedWriting: Off
  ExpandRGBPalette: On
  IsReadAsScalarPlusPalette: False

Applying script (with any l or b, or applying soft threshold or not)

./rieszWaveletPhaseAnalysis -i $RESULTS/Carrageenan/CarrKbin1_1792_4x4x1_tile_1.nrrd -o $RESULTS/Carrageenan/Adenoised -d 3 -l 4 -b 4 -w Held --apply -v

Original:
rieszvieworiginal

Inner:
rieszviewinner

Border:
rieszviewborder

Python wrapping for all the classes.

A list to keep track of classes without wrapping: https://github.com/phcerdan/ITKIsotropicWavelets/tree/master/wrapping:

Core

Decimate/Expand (in frequency or spatial domain).

  • itkExpandWithZerosImageFilter and itkShrinkDecimateImageFilter. Done in #146

Utilities

  • itkIsotropicWaveletUtilities. Done in #145

Wrap enhancements:

  • Wrap output of Forward/Inverse using itk::VectorContainer instead of current std::vector. Or wrap std::vector<ImagePointer> with ImagePointer ${WRAP_COMPLEX_REAL_TYPE}. Follow on in #67

Provide a method to apply a RieszRotationMatrix to the output of RieszFrequencyFilterBankGenerator

RieszRotationMatrix, as already documented, provides a way to transform an input physical rotation matrix into a matrix that can be used to steer riesz components generated from the RieszFrequencyFilterBankGenerator.

Please note that the output of the RieszGenerator is a std::vector of output images.
The RieszRotationMatrix is a itkVariableSizeMatrix, so you can get the resulting matrix with rieszRotationMatrix.GetVnlMatrix().

The problem raised by @PierreFontaine is that we do not provide any method to apply the RieszRotationMatrix to the output of the RieszGenerator.

A new method should be provided to do this.

StructureTensor speed up.

The computation of large StructureTensor is slow. For example when used with a large number of Riesz components in the related ImageToImageFilter. See #62 for the ongoing renaming and refactor.

4 tests are failing.

The following tests FAILED:
22 - itkWaveletFrequencyInverseTest2D (Failed)
23 - itkWaveletFrequencyInverseTest2DMultiLevelMultiBand (Failed)
47 - itkFrequencyExpandAndShrinkTest2D (Failed)
48 - itkFrequencyExpandAndShrinkTest3D (Failed)
Errors while running CTest

[Thought] About the restriction to input images size to be: scaleFactor^k

Raised in the ITK review by Samuel Gerber patch set 59

In: ComputeMaxNumberOfLevels should the maximal level size not be the fractional part even if it's not an integer? Being only able to deal with images of sizes 2^k seems overly restrictive.

me:

You mean to take always the exponent, ignoring the value of the fractional part. So in ComputeMaxNumberOfLevels(9,2) , it would return 3 (2^3=8), instead of 1. Or in ComputeMaxNumberOfLevels(14,2) = 3.
Well, not sure, I have to look how other multi-resolution frameworks deal with that. It might be possible... but I see a problem with the inverse pyramid and the lossless reconstruction, that I am not sure how to solve.
Forward:
Input: I = 9, scaleFactor: s = 2.
Levels = 3.
Lv 1: Size Details Wavelet, d = 9 . IApprox = 5.
Lv 2: d = 5; Iapprox = 3.
Lv 3: d = 3; Iapprox = 2.
That require some averaging, but it's ok, but how do we deal with the reconstruction now?
Inverse:
Lv 3: d = 3 --> d_up = 5. How? Losless? Any operation it is dependent on the frequency layout as well.
And if instead of rounding up, we round down, how do we extrapolate in the inverse pyramid? Losless?
I agree is restrictive and I am keen to hear solutions, I haven't explored further on this after concluding it wasn't an easy path.
The solution right now is a classic, just pad the image with zeros with FFTPad. I have also added a FFTPadPositiveIndexImageFilter, that doesn't add negative indices, which are problematic with neighbour iterators.

Inverse Riesz transform

Is there an Inverse Riesz transform to convert all Riesz coefficients back into a signal?

Improve class documentation

Whenever a paper is mentioned, including the corresponding reference (i.e. full bibliography cite and/or link) would be nice.
See for example, the block
* \brief Wavelet based on paper VOW: Variance-Optimal Wavelets for Steerable Pyramid (P.Pad et al 2014).
in itkVowIsotropicWavelet.h.

On the other hand, formulas must follow Doxygen rules [1]. There are a few examples in ITK, such as [2].

[1] http://www.stack.nl/~dimitri/doxygen/manual/formulas.html
[2] https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/ImageNoise/include/itkShotNoiseImageFilter.h

Add the missing test baseline comparisons

There are a number of tests whose output is not yet being compared to a baseline, e.g. itkFFTPadPositiveIndexImageFilterTest.

The tool could be improved by steadily adding the baseline images to the corresponding folder, and add the --compare-MD5 flag with the appropriate arguments to the corresponding test in the CMakeLists.txt file.

I may be able to help with the task.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.