there are a couple of typos in your code, and the regexp doesn't seem to match the property you want for some reason.
This seems to do what you want.
#+begin_src emacs-lisp
(defun org-contacts-icon-property-image-overlay (&optional limit)
(when (re-search-forward org-heading-regexp limit t)
(let ((beg (match-beginning 0))
(end (match-end 0))
(image-file (org-entry-get nil "ICON"))
org-contacts-icon-property-image
org-contacts-icon-property-image-overlay)
(when (and (not (ov-at beg)) (file-exists-p image-file))
(setq org-contacts-icon-property-image (create-image (expand-file-name image-file)
'imagemagick nil :width 100))
(setq org-contacts-icon-property-image-overlay (make-overlay beg (+ 1 beg)))
(overlay-put org-contacts-icon-property-image-overlay 'before-string (propertize " "
'display org-contacts-icon-property-image))
(overlay-put org-contacts-icon-property-image-overlay 'org-image-overlay t)
(overlay-put org-contacts-icon-property-image-overlay 'modification-hooks
(list 'org-display-inline-remove-overlay))))))
(font-lock-add-keywords
nil
'((org-contacts-icon-property-image-overlay (0 'font-lock-keyword-face t)))
t)
#+END_SRC