Another possible solution would be to use Javascript. With this code you can not only replace images, but any content.
It is important to apply the classes content-target and content-source. It is also important to use the display: none; style.
The html could look like:
<section>
    <h3>Headline</h3>
    <div class="content-target"></div>
    <div style="display: none;">
        <div class="content-source fragment" data-fragment-index="0">
            <img src="path/to/image.jpg" />
            <p>Some text</p>
        </div>
        <div class="content-source fragment" data-fragment-index="1">
            <ul>
                <li>List item 1</li>
                <li>List item 2</li>
            </ul>
        </div>
        <div class="content-source fragment" data-fragment-index="2">
            <img src="path/to/another/image.jpg" />
        </div>
    </div>
</section>
Now we add a function fadeContent() and call it every time fragmentshown or fragmenthidden is triggered.
function fadeContent($el, back=false) {
    // If we go back, choose previous element, otherwise current element
    $new = (back ? $el.prev() : $el);
    if($new.length == 0) {
        $text = $el.parent().siblings('.content-target');
        $text.fadeOut(200);
    } else {
        $text = $new.parent().siblings('.content-target');
        $text.hide(0, function() {
            $text.html($new.html());
            $text.fadeIn(300);
        });
    }
}
Reveal.addEventListener('fragmentshown', function(event) {
    // Get first fragment which has "content-source" class
    var $el = $($(event.fragments).filter(function() {
        return $(this).hasClass('content-source')
    })[0]);
    // Show content
    if ($el.hasClass('content-source'))
        fadeContent($el);
});
Reveal.addEventListener('fragmenthidden', function(event) {
    // Get first fragment which has "content-source" class
    var $el = $($(event.fragments).filter(function() {
        return $(this).hasClass('content-source')
    })[0]);
    // Hide element
    if ($el.hasClass('content-source'))
        fadeContent($el, back=true);
});
Since we have just extended the fragment functionality, we can still use the data-fragment-index attribute and change the order.
The solution can easily be optimized/customized.