sf::Image G, sf::Image T1, sf::Image MI, sf::Image SMI
Use references, otherwise you'll copy the whole images (which take probably several KB or MB of memory) every time you call the function!
const sf::Image& G, const sf::Image& T1, const sf::Image& MI, const sf::Image& SMI
And instead of copying the visible area to a new image, why don't you simply use the SubRect property of the sprite?