--- a +++ b/src/addNoiseToImage.cxx @@ -0,0 +1,106 @@ + +#include <nanobind/nanobind.h> +#include <nanobind/stl/vector.h> +#include <nanobind/stl/string.h> +#include <nanobind/stl/tuple.h> +#include <nanobind/stl/list.h> +#include <nanobind/ndarray.h> +#include <nanobind/stl/shared_ptr.h> + +#include <exception> +#include <vector> +#include <string> + +#include "itkImage.h" + +#include "itkAdditiveGaussianNoiseImageFilter.h" +#include "itkSaltAndPepperNoiseImageFilter.h" +#include "itkShotNoiseImageFilter.h" +#include "itkSpeckleNoiseImageFilter.h" + +#include "antsImage.h" + +namespace nb = nanobind; +using namespace nb::literals; + +template <typename ImageType> +AntsImage<ImageType> additiveGaussianNoise( AntsImage<ImageType> & antsImage, + float mean, + float standardDeviation ) +{ + typename ImageType::Pointer itkImage = antsImage.ptr; + using NoiseFilterType = itk::AdditiveGaussianNoiseImageFilter<ImageType, ImageType>; + typename NoiseFilterType::Pointer noiser = NoiseFilterType::New(); + noiser->SetInput( itkImage ); + noiser->SetMean( mean ); + noiser->SetStandardDeviation( standardDeviation ); + noiser->Update(); + AntsImage<ImageType> outImage = { noiser->GetOutput() }; + return outImage; +} + +template <typename ImageType> +AntsImage<ImageType> saltAndPepperNoise( AntsImage<ImageType> & antsImage, + float probability, + float saltValue, + float pepperValue ) +{ + typename ImageType::Pointer itkImage = antsImage.ptr; + using NoiseFilterType = itk::SaltAndPepperNoiseImageFilter<ImageType, ImageType>; + typename NoiseFilterType::Pointer noiser = NoiseFilterType::New(); + noiser->SetInput( itkImage ); + noiser->SetProbability( probability ); + noiser->SetSaltValue( saltValue ); + noiser->SetPepperValue( pepperValue ); + noiser->Update(); + AntsImage<ImageType> outImage = { noiser->GetOutput() }; + return outImage; +} + +template <typename ImageType> +AntsImage<ImageType> shotNoise( AntsImage<ImageType> & antsImage, + float scale + ) +{ + typename ImageType::Pointer itkImage = antsImage.ptr; + using NoiseFilterType = itk::ShotNoiseImageFilter<ImageType, ImageType>; + typename NoiseFilterType::Pointer noiser = NoiseFilterType::New(); + noiser->SetInput( itkImage ); + noiser->SetScale( scale ); + noiser->Update(); + + AntsImage<ImageType> outImage = { noiser->GetOutput() }; + return outImage; +} + +template <typename ImageType> +AntsImage<ImageType> speckleNoise( AntsImage<ImageType> & antsImage, + float scale + ) +{ + typename ImageType::Pointer itkImage = antsImage.ptr; + using NoiseFilterType = itk::SpeckleNoiseImageFilter<ImageType, ImageType>; + typename NoiseFilterType::Pointer noiser = NoiseFilterType::New(); + noiser->SetInput( itkImage ); + noiser->SetStandardDeviation( scale ); + noiser->Update(); + + AntsImage<ImageType> outImage = { noiser->GetOutput() }; + return outImage; +} + +void local_addNoiseToImage(nb::module_ &m) +{ + m.def("additiveGaussianNoiseF2", &additiveGaussianNoise<itk::Image<float, 2>>); + m.def("additiveGaussianNoiseF3", &additiveGaussianNoise<itk::Image<float, 3>>); + + m.def("saltAndPepperNoiseF2", &saltAndPepperNoise<itk::Image<float, 2>>); + m.def("saltAndPepperNoiseF3", &saltAndPepperNoise<itk::Image<float, 3>>); + + m.def("shotNoiseF2", &shotNoise<itk::Image<float, 2>>); + m.def("shotNoiseF3", &shotNoise<itk::Image<float, 3>>); + + m.def("speckleNoiseF2", &speckleNoise<itk::Image<float, 2>>); + m.def("speckleNoiseF3", &speckleNoise<itk::Image<float, 3>>); +} +