% QUANTIZEPHASE Quantize phase values in an image
%
% Usage: qim = quantizephase(im, N)
%
% Arguments: im - Image to be processed
% N - Desired number of quantized phase values
%
% Returns: qim - Phase quantized image
%
% Phase values in an image are important. However, despite this, they can be
% quantized very heavily with little perceptual loss. The value of N can be
% as low as 4, or even 3! Using N = 2 is also worth a look.
%
%
% Copyright (c) 2011 Peter Kovesi
% Centre for Exploration Targeting
% The University of Western Australia
% http://www.csse.uwa.edu.au/~pk/research/matlabfns/
%
% Permission is hereby granted, free of charge, to any person obtaining a copy
% of this software and associated documentation files (the "Software"), to deal
% in the Software without restriction, subject to the following conditions:
%
% The above copyright notice and this permission notice shall be included in all
% copies or substantial portions of the Software.
%
% The software is provided "as is", without warranty of any kind.
% May 2011
function qim = quantizephase(im, N)
IM = fft2(im);
amp = abs(IM);
phase = angle(IM);
% Quantize the phase values as follows:
% Add pi - .001 so that values range [0 - 2pi)
% Divide by 2pi so that values range [0 - 1)
% Scale by N so that values range [0 - N)
% Round twoards 0 using fix giving integers [0 - N-1]
% Scale by 2*pi/N to give N discrete phase values [0 - 2*pi)
% Subtract pi so that discrete values range [-pi - pi)
% Add pi/N to counteract the phase shift induced by rounding towards 0
% using fix.
phase = fix( (phase+pi-.001)/(2*pi) * N) * (2*pi)/N - pi + pi/N ;
% figure, hist(phase(:),100)
% Reconstruct Fourier transform with quantized phase values and take inverse
% to obtain the new image.
QIM = amp.*(cos(phase) + i*sin(phase));
qim = real(ifft2(QIM));