Python UI: How to load an image from drive and select it?
You can use the updated PointerProperty from Blender 2.79a RC1 onward.
However, take a look at the issues surrounding them first and decide if these drawbacks (mostly related to compatibility) are acceptable in your usage scenario: https://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.79/PythonAPI
(Section Data-block Pointer Properties)

This is how you use them:

In your register() function:

Remove the StringProperty, instead use this:

# (Import Scene and Image just so the line is shorter)
from bpy.types import Scene, Image
Scene.my_image = bpy.props.PointerProperty(name="Image", type=Image)


In your draw() method:

Remove the prop_search and operator, instead use template_ID:

layout.template_ID(self, "my_image", open="image.open")