i think first aproach is best,
very likly you will keep reference to shape (ie in case when you want to move or resize displayed object), so all what you need to do is implementing extra method boolean isIn(Point mouseclick,Shape shape)
(because implementation of if might be different for each type of object, will be better if you place it on your Shape)
i'm not sure how you want your ghostcanvas work, but imho drawing anything extra sounds like huge waste of resources.
your third strategy will require grab raw pixel from image/canvas which might be expensive operation