Begin by creating a noise map with dimensions (width + 1) x (height + 1)that will be used displace the original image. I suggest using some sort of perlin noise so that the displacement is not to random.
Once we have the noise we can do something like this:
Image noisemap;
Image source;
Image destination;
float displacementRadius = 10.0f;
for (int y = 0; y < source.height(); ++y) {
for (int x = 0; x < source.width(); ++x) {
const float n0 = float(noise.getValue(x, y)) / 255.0f;
const float n1 = float(noise.getValue(x + 1, y)) / 255.0f;
const float n2 = float(noise.getValue(x, y + 1)) / 255.0f;
const int dx = int(floorf((n1 - n0) * displacementRadius + 5f));
const int dy = int(floorf((n2 - n0) * displacementRadius + 5f));
const int sx = std::min(std::max(x + dx, 0), source.width() - 1);
const int sy = std::min(std::max(y + dy, 0), source.height() - 1);
const Pixel& value = source.getValue(sx, sy);
destination.setValue(x, y, value);
}
}