The Image Interface and Canvas Interface are different, but they do have things in common, like .outline[], .merge[], .copy[], and .paste[].
image[pos] is described like this:
The pattern index of an (x,y) pixel of the image. Reads nil out of bounds, ignores out of bounds writes. r/w.
canvas[pos] is described like this:
The pattern index of an (x,y) pixel of the canvas. Reads 0 out of bounds, ignores out of bounds writes. r/w.
The only difference is that canvas[pos] is described as returning 0 if you ask for a pixel outside the edges, but that seems to be incorrect - in my testing canvas[-1,-1] returns nil just like an image.