Answers from a heavy numpy user with little experience with scikits-image, so they may not be consistent with general API rules:
1. Either accept both, with a keyword argument, e.g. flat_idx=True or ravel_idx=True, or have two functions doing the exact same thing, one for each type of index. I prefer the former than the latter.
2. Whatever the input, accept anything array-like. If you are dealing with multi-indices, either require that the actual dimensions are along the last axis, or have an axis keyword argument that specifies it. It may not be necessary, but it may make users life easier if you do not force a specific shape like (r,d) for r indices with d dimensions, but something like (r, s, d) is also accepted, and produces a return of e.g. shape (n,r,s,d), where n is the number of neighbors.
3. Anything returned that is not an array is going to be a big performance hit... You could adopt a modified version of what scipy.ndimage does for similar situations: have a mode keyword argument, e.g. convolve accepts {‘reflect’,’constant’,’nearest’,’mirror’, ‘wrap’}, a 'constant' mode could be used to mark (by default) indices out of bounds with -1, which is equivalent to returning a validity mask, specially if you roll an example using np.any in the docstring, 'mirror' or 'reflect' are good options if you need a list of neighbors but don't mind repetitions, and I very often work with images that are tiled, so 'warp' would be a good thing also.
Jaime