Recently, I have encountered an issue with ArrayPlot after performing a Fourier transform of a table.

Picture presented above is an ArrayPlot of a 2D table. Using Fourier on this 2D table I obtain the following ArrayPlot:

After this procedure one ends up with the result which consists of data at four vertices of the square. The thing is that I would like the result to be in this form:

I have tried different Fourier transform parameters but none of them had delivered the demanded image.

Thank you in advance for your reply!

=================

2

I guess what you’re looking for is an analogue of Matlab’s fftshift. It’s not really an issue with ArrayPlot, it’s an question of visualizing the result of the Fourier transform.

– Rahul

Mar 7 ’14 at 12:11

=================

2 Answers

2

=================

This is really ancient code that should do what you need.

It was written on MMA version 3 or 4 (or 5??) – I don’t remember – and I have not tested it on newer versions.

If it does not work you’ll probably have to find a newer procedure to extract the dimensions from an image.

So, here’s the code, it works on a matrix of values and gives you a matrix that represents the (generally complex) FFT you are after:

FFT2D[mat_] := Module[{ft, hshift, wshift},

ft = Fourier[mat];

{hshift, wshift} = IntegerPart[(# + .5)/2] & /@ Dimensions[ft];

Transpose[RotateLeft[

Transpose[RotateLeft[

ft,

hshift]],

wshift]]

]

This is how I used it back then (again, you might have to adjust the code, possibly by changing ListDensityPlot with ArrayPlot)

mat = GrayScaleMatrix[“Image1.bmp”];

(* this was a silly conversion from color to grayscale, see later *)

{hshift, wshift} = IntegerPart[(# + .5)/2] & /@ Dimensions[mat]

(* this is just extracting the dimensions of the image*)

ListDensityPlot[mat, MeshRange -> {{-wshift, wshift}, {-hshift, hshift}}]

(* and this is plotting it to show the gray scaled image *)

Instead of Fourier, I would use FFT2D. That’s it.

fft = FFT2D[mat];

Plotting might require the previously extracted information about the image’s dimensions.

ListDensityPlot[Abs[fft], MeshRange -> {{-wshift, wshift}, {-hshift, hshift}}]

Addendum – And this is the procedure I used to convert color bitmaps into gray scale ones (I wanted to experiment with actual pictures and I did not have the time to figure out how to properly create a gray scaled version). I include it here just in case you want to try with the actual data it has worked for me

GrayScaleMatrix[filename_String] := Module[{pic},

pic = Import[filename];

pic[[1, 1]] /. {r_, g_, b_} :> (.3r + .6g + .1b)

]

RotateLeft can rotate rows and columns in one go: RotateLeft[ft, {hshift, wshift}]

– Simon Woods

Mar 7 ’14 at 17:17

You schould always share some code 🙂

pic = Import[“http://i.stack.imgur.com/y1IuJ.png”]

dat = ImageData@ColorConvert[pic, “GrayScale”];

Dimensions@dat

(img = ArrayPad[

Abs[Fourier[dat]][[2 ;; 154, 2 ;; 154]],

{{153, 0}, {153, 0}},

“Reversed”]) // Image // ImageCrop // ColorNegate

img // Image // ImageCrop[#, {60, 30}] & // ColorNegate

% // ImageAdjust

@Matt so, is this what you are after?

– Kuba

Mar 7 ’14 at 11:51