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;
}
예제 #2
0
void CSteganoExecutor::onProposed(PArgsList pArgsList)
{
    emit proposed(pArgsList);
}