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
// 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.
// If the flag below is true, this assumes the DC component is in the
// center of the image.  This needs to match the value in the
// .toComplexArrayFromLog call below.
img2f = ff.toLogImage[true]
println["Resultant image size from FFT is " + img2f.getSize[]]["FFT Magnitude-Phase"]

// 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]["Inverse FFT"]

// 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.
// If the flag below is true, this assumes the DC component is in the
// center of the image.  This needs to match the value in the .toLogImage call
// above.    
a2 = img2f.toComplexArrayFromLog[true]
ia = inverseFFT[a2]
back = ia.toImage[origWidth, origHeight]["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 19030 days, 12 hours, 44 minutes ago.