An sf::Image is class that holds image information on the memory of your CPU (your PC's 'core') and has the ability to load different image formats from the disk. It's also here where you can manipulate the image information directly.
An sf::Texture is class that holds image information on the memory of your GPU (your graphics card's 'core') and makes use of sf::Image's ability to load different image formats and copies the image information from the sf::Image to itself (i.e. sf::Texture does not load the image itself, it only provides an interface to do so).
sf::Image and sf::Texture are both 'containers' for image information, but they can't get drawn to the render target directly. That's where sf::Sprite comes into play, but since the sf::Image is in the CPU's memory and thus the way to the GPU (graphics card) is long, sf::Sprite can only make direct use of a sf::Texture, thus when you want to use sf::Image's information you'll have to copy it to a sf::Texture, which can be quite a heavy (in time) task.
sf::Sprite is class that can draw a rectangle of a sf::Texture to a render target. It can also transform it in the 2D space (translate, rotate and scale).
Now for the sf::RenderTarget is just a target one can render sprites, vertex array, shapes etc. to. There are two classes that are defined as sf::RenderTarget: sf::RenderWindow and sf::RenderTexture. Both act very similar and can also be handled very similar. The major difference is that sf::RenderWindow gets directly displayed on the screen (that's what you get to see), whereas the sf::RenderTexture stays hidden on the GPU's memory and you can get the rendering as a texture and draw it to the screen.
If you're interested in the process behind this, then you may want to search for 'double buffering' and similar keywords.
I hope I could clarify some things.