#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageRandomNonRepeatingIteratorWithIndex.h"
#include "itkImageFileWriter.h"
#include "itkMersenneTwisterRandomVariateGenerator.h"
#include <itkPNGImageIOFactory.h>
int main(int argc, char * argv[])
{
using ImageType = itk::Image<unsigned char, 2>;
using ReaderType = itk::ImageFileReader<ImageType>;
using IteratorType = itk::ImageRandomNonRepeatingIteratorWithIndex<ImageType>;
using WriterType = itk::ImageFileWriter<ImageType>;
// Read the binary file
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName("C:/Users/rw/Desktop/Yinyang.png");
itk::PNGImageIOFactory::RegisterOneFactory();
reader->Update();
// At x% of the pixels, add a uniform random value between 0 and 255
IteratorType it(reader->GetOutput(), reader->GetOutput()->GetLargestPossibleRegion());
it.SetNumberOfSamples(reader->GetOutput()->GetLargestPossibleRegion().GetNumberOfPixels() * 0.75);
std::cout << "Number of random samples: " << it.GetNumberOfSamples() << std::endl;
using GeneratorType = itk::Statistics::MersenneTwisterRandomVariateGenerator;
GeneratorType::Pointer random = GeneratorType::New();
it.GoToBegin();
while (!it.IsAtEnd())
{
it.Set(random->GetUniformVariate(0, 255));
++it;
}
// Write the file
WriterType::Pointer writer = WriterType::New();
writer->SetFileName("C:/Users/rw/Desktop/Yinyang1.png");
writer->SetInput(reader->GetOutput());
writer->Update();
return EXIT_SUCCESS;
}