FourierImage.frink

View or download FourierImage.frink in plain text format

/** This demonstrates using Fourier transforms to process an image, obtain its
    Fourier transform, display the Fourier transform in a logarithmic scale,
    and then invert the transform to produce the original image. */



// Image available at https://frinklang.org/frinksamp/AudreyHepburnMoire.jpg
// It has a noisy Moire pattern
img = new image["file:AudreyHepburnMoire.jpg"]

// Comment in the resize below to test different image sizes.
//img = img.resize[undef, 1024]

[origWidth, origHeight] = img.getSize[]
println["image size is [$origWidth, $origHeight]"]

// Make the image into an efficient data structure (ComplexArray) and then
// take its two-dimensional Fourier transform.
array = img.toComplexArray[]
ff = FFT[array]

// Encode the image into an image that contains magnitude-phase components.
// The magnitude is encoded into the green channel on a logarithmic scale,
// and the phase is encoded into the red channel.
img2f = ff.toLogImage[]
println["Resultant image size from FFT is " + img2f.getSize[]]
img2f.show["FFT Magnitude-Phase"]
img2f.write["fft.png"]

// Reverse the FFT of the image and display it.  This is all done in memory
// and should preserve the original image very closely.
inverseF = inverseFFT[ff]
inverseImgF = inverseF.toImage[origWidth, origHeight]
inverseImgF.show["Inverse FFT"]
inverseImgF.write["reconstructed.png"]

// Reverse the magnitude-phase encoded image into the original image.  This
// has gone through a few levels of re-encoding, but the result should look
// like the original image.
a2 = img2f.toComplexArrayFromLog[]
ia = inverseFFT[a2]
back = ia.toImage[origWidth, origHeight]
back.show["Inverse from FFT Magnitude-Phase image"]


View or download FourierImage.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 18176 days, 11 hours, 11 minutes ago.