Why does the ifft2 image split in 4? - matlab

After doing a two-dimensional inverse Fourier transform in MATLAB, I got the 4-part split image of MRI. How can I solve this problem?
for i =1:8
raw_i = ifft2(kspace(:,:,i)); %kspace contains the 8-coil wise MRI data w.o undersampling , 160*160*8 matrix
imshow(abs(raw_i),[]);

Use fftshift to rearrange the result; it shifts the zero frequency parts to the center of the image.
imshow(fftshift(abs(raw_i)),[]);

Related

Image average multipe frame same matrix. Matlab

I've a matrix RF = RF(512,1728). This matrix contain 9 images and the number of frame is equal 9, the first image considering one single frame is: RF1 = RF1(:,1:192) etc. So I'd like to average the hole matrix in order to obtain one single image. any idea?
Thanx in advance!
Just reshape the matrix
allRF=reshape(RF,[512,192,9]);
and compute the mean
meanRF=mean(allRF,3);
A simple, vectorized way:
k=reshape(RF,512,192,1728/192);
mean(k,3)

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);

How to find Correlation of an color image [duplicate]

I need to calculate 3D cross-correlation in MATLAB. Anyone know which function I should use? For 2–D cross-correlation it has xcorr2, but I don't know about is 3D.
Correlation is similar to convolution except that one does not need to flip an input about the origin (but correlation needs taking the complex conjugate of one of the operands), so for 3D real matrices, you can use convn(x3d,y3d(end:-1:1,end:-1:1,end:-1:1)) to compute 3D cross correlation.

Fourier Transform of a vector in 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

image processing - enlarging an image using FFT (Matlab code)

I'm trying to write a simple matlab code which enlarges an image using fft. I tried the known algorithm for image expansion, which computes the Fourier transform of the image, pads it with zeros and computes the inverse Fourier of the padded image.
However, the inverse Fourier transform returns an image which contains complex numbers.
Therefore, when I'm trying to show the result using imshow, I'm getting the following error:
Warning: Displaying real part of complex input.
Do you have an idea what am I doing wrong?
my code:
im = imread('fruit.jpg');
imFFT = fft2(im);
bigger = padarray(imFFT,[10,10]);
imEnlarged = ifft2(bigger);
Thanks!
That's because the FFT returns values corresponding to the discrete (spatial) frequencies from 0 through Fs, where Fs is the (spatial) sampling rate. You need to insert zeros at high frequencies, which are located at the center of the returned FFT, not in its end.
You can use fftshift to shift the high frequencies to the end, pad with zeros, and then shift back with ifftshift (thanks to #Shai for the correction):
bigger = ifftshift(padarray(fftshift(imFFT),[10,10]));
Also, note that padding with zeros decreases the values in the enlarged image. You can correct that using a suitable amplification factor amp, which in this case would be equal to (1+2*10/length(im))^2:
bigger = ifftshift(padarray(fftshift(amp*imFFT),[10,10]));
You can pad at the higher frequencies directly (without fftshift suggested by Luis Mendo)
>> BIG = padarray( amp*imFFT, [20 20], 0, 'post' );
>> big = ifft2( BIG );
If you want a strictly real result, then before you do the IFFT you need to make sure the zero-padded array is exactly conjugate symmetric. Adding the zeros off-center could prevent this required symmetry.
Due to finite numerical precision, you may still end up with a complex IFFT result, but the imaginary components will all be tiny values that are essentially equivalent to zero.
Your FFT library may contain a half-to-real (quarter-size input for 2D) version that enforces symmetry and throws away the almost-zero numerical noise for you.