copyMakeBorder, costs one copy. the downside is that this can only add whole pixels worth of data, so if you need perfect accuracy in fractions of a degree, you’d need to spend a little thought on everything.
if you’re looking for maximum speed, or need to control the math fairly precisely (by pixels/subpixel), you’d want to compare that against a custom xymap suitable for remap(). warpPolar might be using the special case math (vs. remap) to its advantage… or maybe precomputing the map makes it cheaper.
that’s bad. put the center further down. it’s at the top now. put it at half height. also, the order is (x,y), and source.shape (height, ~709) has no meaning in the output. the output is purely shaped according to radius.