The basic operation is pretty simple: you copy the new image from TFTP to flash, and then you boot the router using the new image in flash.
The potential complications are related to the size of flash, the contents of flash, and whether there is room in flash for 2 copies of image files (the old image and the new image).
If you have the new image on the TFTP server then you should know its (approximate) size. If you do show flash on the router it will tell you how much is used and how much is free. If the amount free is larger than the new image size then it is easy to have 2 images in flash. If the amount free is smaller than the new image then you need to free up some space in flash before you can load the new image. There may be some other files in flash that you can delete to free up space. Or you may need to delete the old image file (in which case you wind up with only a single image in flash). You would need to figure whether you need to delete anything and if so what you will delete.
Once you have enough space in flash then you use the copy tftp: flash: command to load the image into flash.
If you wind up with only a single image in flash (the new one we assume) then it is simple to boot the new image. You reload the router and it will automatically boot the image (the only one in flash) and you should be good to go.
If there are more than one image file in flash then the router will attempt to boot the first image file that it finds - typically that would be the original image. In this case you should configure boot system commands to tell the router which image to boot. The syntax of the command is: boot system flash:<image_name>
I frequently configure 2 boot system commands: first a boot system command pointing to the new image and then a boot system command pointing to the old image (just in case there is some issue in booting the new image).