In optical distortion, the distance the pixel moves from its correct location is proportional to the cube of the radius from the optical axis. In other words:
rBad = rTrue + df * rTrue;
Where rTrue is where it should be if there were no distortion, df is the magnitiude of the fish-eye effect, and rBad is where it actually is (because of the distortion). You can use that formula to get find out where bad pixels should get mapped (sent) to. Make a grid of every 10 pixels or so and find out what their true location should be.
Then I believe you can use those locations (the actual bad locations, and the desired good locations) in imtransform() to un-distort the image. Give it a try. Demo attached. See if you can finish it by using imtransform().
The + are the distorted points and the o are the corrected points. Not sure why the legend function is not realizing what points are what.