Fourier Transform of a vector in Matlab - matlab

I have a an image matrix that I converted to grayscale and then pulled one random row from it like so:
img = imread('Image.png');
grayImage = rgb2gray(img);
grayImage1 = im2double(grayImage);
vector1 = grayImage1((100),:);
I want to do a Fourier Transform of the extracted vector in order to get frequencies correlated to the intensity values of the gray image. I don't really have any knowledge of Fourier transform other than the fact that it converts a signal to a set of frequencies. If I did a sine wave for example, I should see the frequencies and magnitudes of the sine wave and I want to be able to see that with the vector I have. I can try to be more specific if this isn't enough information but any help would be appreciated. Thank you in advance.

There is a syntax named fft.
type
help fft
in your command line

Related

How to calculate image histogram without normalizing data in Matlab

I have an image I which pixel intensities fall within the range of 0-1. I can calculate the image histogram by normalizing it but I found the curves is not exactly the same as the histogram of raw data. This will cause some issue for the later peaks finding process(See attached two images).
My question is in Matlab, is there any way I can plot the image histogram without normalization the data so that I can keep the curve shape unchanged? This will benefit for those raw images when their pixel intensities are not within 0-1 ranges. Currently, I cannot calculate their histogram if I don't normalize the data.
The Matlab code for normalization and histogram calculation is attached. Any suggestion will be appreciated!
h = imhist(mat2gray(I));
Documentation of imhist tells us that the function checks the data type of the input and scale the values accordingly. Therefore, without testing with your attached data, this may work:
h = imhist(uint8(I));
An alternatively you may scale the integer-representation to floating-representation, by either using argument of mat2gray
h = imhist(mat2gray(I, [0,255]));
or just divide it.
h = imhist(I/255);
The imhist answer in this thread describing normalizing or casting is completely correctly. Alternatively, you could use the histogram function in MATLAB which will work with unnormalized floating point data:
A = 255*rand(500,500);
histogram(A);

Do I need to normalize an image before smoothing it with a Gaussian Filter

I have a real image with range [0 255]. I want to apply Gaussian filter to smooth it. As I know, the Guided filter needs the image to be normalized before being applied. However, I am not sure what is the case for the Gaussian filter. The code example in MATLAB 2015b does not normalize the image before applying the Gaussian filter. My question is: Do I need to normalize the image before smoothing it with Gaussian Filter? Thanks.
%% This code did not normalize image
I = imread('cameraman.tif');
Iblur = imgaussfilt(I, 2);
Gaussian filter is just a weighted average filter. There is no need for normalization.

Fourier transformation

I'm writing currently a program in Matlab which is related on image hashing. Loading the image and performing a simple down-sampling was not a problem.Here is my code
clear all;
close all;
clc;
%%load Image
I = im2single(imread('cameraman.tif'));
%%Perform filtering and downsampling
gaussPyramid = vision.Pyramid('PyramidLevel', 2);
J = step(gaussPyramid, I); %%Preprocessed Image
%%Get 2D Fourier Transform of Input Image
Y = fft2(I); %%fft of input image
The algorithm next assumes that 2D Fourier Transform ( Y in my case ) must be in the form Y(f_x,f_y) where f_x,f_y are the normalized spatial frequencies
in the range [0, 1].I'm not able to transform the output of fft2 function from Matlab as it is required by the algorithm.
I looked up the paper in question (Multimedia Forensic Analysis via Intrinsic and Extrinsic Fingerprints by Ashwin Swaminathan) and found
We take a Fourier transform on the preprocessed image
to obtain I(fx, fy). The Fourier transform output is converted into polar co-ordinates to arrive at I′(ρ, θ)
By this, they seem to mean that I(fx, fy) is the Fourier transformation of the image. But they're trying to use the Fourier-Mellin transformation, which is different from a simple fft2 on the image. Based on the information found in this set of slides,
If an input image is expressed in terms of coordinates that are natural logarithms of the original coordinates, then the magnitude of its FT is insensitive to any change in scale of the original image (since it is Mellin Transform in the original coordinates)
and in files on the MATLAB Central File exchange, you have to do additional work to get the Mellin-Fourier transform; particularly, taking the magnitude (which appears to be your missing step), converting the coordinates to log polar and taking a second fft2. It's unclear to me why the log of log polar coordinates was omitted from the paper in the steps required. See an implementation for image registration here for an example. Note that this code is old, and the transformImage method appears not to exist; it does the log polar transform.

How to make the Fourier Descriptor result to be Insensitive?

I am trying to distinguish shape for images in Matlab by using the Fourier Descriptor. What I want to do is : 1. Generate the Fourier Descriptors for each image; 2. Calculate the Euclidian Distance between these Fourier Descriptors to compare the shapes.
My problem is I cannot make the result of calculating the Fourier Descriptor to be insensitive for the geometric transformation (e.g. Rotation & Scaling).
The code I use now is the "Gonzales matlab version", the one in this link. I have tried to normalize the result by doing this:
% Normalization
DC = f(1);
f = f(2:11); % getting the first 20 & deleting the dc component
f = abs(f) ; % use magnitudes to be invariant to translation & rotation
f = f/DC; % devide the fourier coeffients by the DC-coefficient to be invariant to scale
But I don't think it worked as I expected. The result is different if I change the direction or the scale of a same image.
I have been trapped by this question for a couple of days. I will appreciate any suggestion, thank you all in advance!
I recommend you to read
"Feauture Extraction and Image Processing for Computer Vision"
by Nixon and Aguado.
You will find there what you are looking for

How to determine frequency in time dimension using FFT and IFFT on 3D Matrix

Currently, I working on a assignment to obtain few frames from a movie file played in Matlab. A 3D Matrix was created in parameter X,Y and time. But I been asked to determine the frequency in time by using FFT and IFFT.
My problem is how to plot the graph by using FFT and IFFT on 3D matrix to determine the frequency in time dimension? If someone can provide part of the matlab code will very appreciate.
Suppose your matrix is A(x,y,t), call
A = ifft(fft(A, NFFT, 3), size(A,3), 3);
to do the transform on time domain. NFFT is the total points needed, usually padding with the size of 2^n.
In fft(A, NFFT, 3), your frequency axis will be (0:NFFT)/NFFT*Fs, where Fs = 1/T, T is the time interval of your frames.