Нашел баг в canvas tkinter'а. если обьявить локальную переменную с картинкой, потом создать канву с этой картинкой, то картинки не будет. При выходе из функции уничтожится переменная, а канва видимо себе не оставляет копии.
UPD: Читать документацию внимательно. Это баг ImageTk, и он описан.