A very good reason to store images outside the web root is if you do not want visitors to be able to see them unless they are logged in. If you have any kind of asset (image, javascript, mp3 file, video) that you want to protect from visitors for any reason, it's probably a good idea to have these objects outside the web root and grant access to them by writing a PHP script that coughs them up only if a user meets your criteria.
Nogdog's recommendation looks pretty good to me. You can make an <img> tag whose src attribtute refers to a PHP script and not the original image and that PHP script would enforce your restrictions. If access is allowed, [man]readfile[/man] is a good basica way to cough up an image/mp3/video, etc:
<img src="my_php_script.php?img=some_image.jpg">
One thing to keep in mind is that while your web server can only serve files that are in the webroot, a PHP script within your web root might be able to read stuff outside of your web root. [man]is_readable[/man] tells you what your PHP script can read, not what the web server can serve in response to a request.