Rotation with FFT
Via shear it is possible to rotate an image. Since we also implemented a shear algorithm, rotation can be implemented as well. For details look at this webpage.
Examples
For full interactivity, have a look at this Pluto notebook.
using Revise, FourierTools, Plots, TestImages, PlutoUI, ImageShow
begin
img = Float32.(testimage("fabio_512_gray"))
z = zeros(Float32, (768, 768))
FourierTools.center_set!(z, img)
end
Gray.(FourierTools.rotate(z, 26))
Function references
FourierTools.rotate
— Functionrotate(arr, θ, rotation_plane=(1,2), adapt_size=true, keep_new_size=false)
Rotate an arr
in the plane rotation_plane
with an angle θ
in rad around the center pixel. Note that, in contrast to ImageTransformations.imrotate
, the rotation is done around the Fourier-center pixel (size()÷2+1) and not the geometric mid point.
Arguments:
arr
: the array to rotateΘ
: the angle (in rad) to rotate byrotation_plane
: two dimensions selecting the 2D plane in which a multidimensional dataset is rotatedadapt_size
: if true (default), the three shears, which make up the rotation, will be allowed to enlarge the size of the array. This is slower but avoids wrap-around artefacts If false, the in-place version ofrotate
is used with all its problems. Only recommended for very small angles!keep_new_size
: if true, the enlarged sizes (only foradapt_size=true
) will also be returned. Otherwise the resulting data will be cut down to the original sizepad_value
: specifies the value that areas outside the visible range (in the source) should be assigend to. A smart choice can reduce edge artefacts.
rotate!
is also available.
FourierTools.rotate!
— Functionrotate!(arr, θ, rotation_plane=(1,2))
In-place rotate an arr
in the plane spanned by the two dimensions in the tuple rotation_plane
with an angle θ
in rad around the center pixel. Note that, in contrast to ImageTransformations.imrotate
, the rotation is done around the Fourier-center pixel (size()÷2+1) and not the geometric mid point. Note also that due to the operation being performed by successive cyclic shear operations in-place, pixels near the corner will be experiencing a massive wrap-around problem. Use the out-of-place version rotate
to avoid this. Note also that this version generates very bad results with the angle approaching π. To fix this, use the out-of-place version of rotate
.
Arguments:
arr
: the array to rotateΘ
: the angle (in rad) to rotate byrotation_plane
: two dimensions selecting the 2D plane in which a multidimensional dataset is rotated