Matthew,
You should provide some sample data otherwise its hard to say without trying things out. One thing that I notice is that imageResize is slow and not needed because you can specify the resolution in Image:
This is much faster
AbsoluteTiming[
Image[RandomReal[1, {500, 500, 3}], ImageSize -> {200, 200}]]
than
AbsoluteTiming[
Image[RandomReal[1, {500, 500, 3}]] // ImageResize[#, {200, 200}] &]
But beyond that I can't duplicate what you are doing without data.
Regards,
Neil