Image_uc GetProposedImage(const Image_uc& im, unsigned int iteration, Image_uc& blur) { // Set up the RNGs static boost::mt19937 rng; static boost::uniform_int<> uniform255(0, 255); static boost::uniform_int<> uniform3sigma(-1.5*sigma, 1.5*sigma); static boost::variate_generator<boost::mt19937&, boost::uniform_int<> > noise255(rng, uniform255); static boost::variate_generator<boost::mt19937&, boost::uniform_int<> > noise3sigma(rng, uniform3sigma); Image_uc proposed(im.Height(), im.Width()); if (iteration % 2 == 0) { // On even iterations, proposal is a gaussian-blurred version of the // current image, plus a small amount of gaussian noise blur = ApplyGaussBlur(im, kernelRadius, gaussianKernel); for (int i = 0; i < im.Height(); ++i) { for (int j = 0; j < im.Width(); ++j) { int p = (int)blur(i, j) + (int)noise3sigma(); if (p > 255) p = 255; if (p < 0) p = 0; proposed(i, j) = (unsigned char)p; } } } else { // On odd iterations, proposal is a uniform random image for (int i = 0; i < im.Height(); ++i) { for (int j = 0; j < im.Width(); ++j) { proposed(i, j) = (unsigned char)(noise255()); } } } return proposed; }
void CSteganoExecutor::onProposed(PArgsList pArgsList) { emit proposed(pArgsList); }