I want to flatten a series of fisheye images by remapping them to a rectinlinear projection.
To achieve this, I need to be able to remap the pixels of the image using fisheye correction formulas for the x-, and y-coordinates. How can I achieve this? I have found this question and this question but I wonder how to use this for fisheye correction.
So far I've tried to use ImageTransformation for this, but I can't get the function to work properly.
f[pt_] := With[{s = {.5, .5}},
Module[{rd, polarcoor, ru, newcoor},
rd = Norm[pt - s]^2/Norm[s];
polarcoor =
CoordinateTransform[{"Cartesian" -> "Polar", 2}, (pt - s)];
ru = 1*Tan[2*ArcSin[((polarcoor[[1]])/(2*1))]];
CoordinateTransform["Polar" -> "Cartesian", {ru, polarcoor[[2]]}]
]
]
ImageTransformation[image,f]
This should first translate the image coordinates to polar coordinates, then calculate the new r (ru=r undistorted), and than translate these back to cartesian coordinates. The ru = 1*Tan[2*ArcSin[((polarcoor[[1]])/(2*1))]]
is based on the above links, with a random value chosen as f. It fi
I get an error message, saying the function doesn't map. Anyone have an idea how to fix this and any further suggestions on how to improve the code?
Update 2 22-10-2013 Changed the code to:
image = Import["http://i.stack.imgur.com/JDX9f.jpg"];
r[pt_] := Module[{rd, ru, polarcoor, a},
rd = Norm[pt];
ru = *Transformation formula*
a = ArcTan @@ (pt);
ru {Cos[a], Sin[a]}
]
Using ru = Sqrt[rd];
ImageTransformation[image, r, DataRange -> {{-1, 1}, {-1, 1}}]
gives
Using ru = ArcTan[rd];
ImageTransformation[image, r, DataRange -> {{-2, 2}, {-2, 2}}]
gives
Both look like a step in the right direction, with straightened lines, but I got them by trial-and-error so I don't know the correctness.
Comments
Post a Comment