Hi.
How interactive will this process be? If the outline is only needed visually, there might be acceptable alternatives, e.g. Laplacians or multi-passing on the Sobel filter. If you will be making the image dynamically, see memory bitmaps.
The color picker needs to pull data from the graphics card, which is generally an expensive process, as well as doing so at a consistent time, thus the delay. That said, glReadPixels() does take a rectangle, so maybe there’s a case to be made for a batched color sampler. Did you try sending several samples at a time, rather than one per frame?
I have a (paid) plugin coming up that will let you load files as their decoded bytes, e.g. see this load function. You could, of course, inspect these very bytes in the way you want. I’ve used them to play around with Philip Rideout’s msquares, for example.
Otherwise, if space isn’t an issue, and you don’t need to dynamically obtain images, you could always pre-decode the images into bytes and save the raw bytes somewhere. (I’ve got some stuff for that as well, though it’s atrociously slow for images of any size. But this matters less when it’s a one-time thing.)