分类: C/C++
2012-06-13 09:48:54
Spatial Frequency of an Image
When we deal with a one dimensional signal (time series), it is quite easy to understand what the concept of frequency is. Frequency is the number of occurrences of a repeating event per unit time. For example, in the figure below, we have 3 cosine functions with increasing frequencies cos(t), cos(2t), and cos(3t).
Here is the Matlab code for this experiment.
clear all;
close all;
clc;
t=0:0.05:2*pi;
figure, plot(cos(t),'r','LineWidth',2),hold on
plot(cos(2*t),'g','LineWidth',2),
plot(cos(3*t),'b','LineWidth',2),
grid on;
hleg1 = legend('cos(t)', 'cos(2t)', 'cos(3t)')
Intuitively, we can conclude that for a function , when increases, the frequency of the function increases. However, when it comes to an image, it is quite difficult to understand what a low or high frequency means. We do not know what a low or high frequency correspond to in an image.
Our mistake is that we focus on the actual image and try to figure out the things although we do not have any example of images with different frequency components. Human is like a machine learning algorithm (actually machine learning algorithms are like human J). To be able to recognize an object, we first need to be trained on that object (God knows). Therefore, let us try to visualize low frequency and high frequency signals. Start with an example of low frequency, that is . First of all, we randomly (this is a lie) take 13 samples of at
}.
The corresponding values are:
.
Here is the Matlab code for this experiment.
clear all;
close all;
clc;
t_continuous=0:0.01:2*pi;
t_discrete =0:0.5:2*pi;
plot(t_continuous,cos(t_continuous),'b','LineWidth',2),hold on
plot( t_discrete,cos(t_discrete) ,'r+','LineWidth',3),
y= cos(t_discrete);
grid on;
hleg1 = legend('cos(t)','samples')
So, we know that a sequence of such numbers gives us the feeling that is a low frequency signal. How we can create an image of these numbers? Let scale the numbers to the range 0 and 255:
. Considering that values are intensity values, we can obtain the following image.
Here is the Matlab code for this experiment.
clear all;
close all;
clc;
t_discrete =0:0.5:2*pi;
y= cos(t_discrete);%imshow(y,[])
y1=y;
y1=y1+abs(min(y1));
y1=y1/max(y1);
y1=uint8(y1*255);
figure,imshow(y1)
grid on;
hleg1 = legend('cos(t)','samples')
This is our first image with a low frequency component. We have a smooth transition from white to black and black to white. However, it is still difficult to say anything since we have not seen an image with high frequency. If we repeat all the steps for , we obtain the following image:
where we have sudden jumps to black. You can try the same experiment for different cosines. By looking at two examples, we can say that if there are sharp intensity changes in an image, those regions correspond to high frequency components. On the other hand, regions with smooth transitions correspond to low frequency components.
We now have an idea for one dimensional image. It is time to switch to two dimensional representation of a signal. Let us first define a kind of two dimensional signal: . For example, the signal for =1, we have: .
Here is the Matlab code for this experiment.
clear all;
close all;
clc;
t_continuous=0:0.01:2*pi;
t_discrete =0:0.5:2*pi;
cost1 = cos(1*t_continuous);
cost2 = cos(1*t_continuous);
plot(t_continuous,cost1,'r','LineWidth',3),hold on
plot(t_continuous,cost2,'g','LineWidth',3)
plot(t_continuous,cost1.*cost2,'b','LineWidth',3),
grid on;
hleg1 = legend('cos(x)','cos(y)', 'cos(x)*cos(y)' )
If you wonder, you can assign different k values () for the base cosine functions, and plot the result. Our goal is to create an image containing a single frequency component as much as possible. Let us pick a cosine signal with a low frequency: . Our corresponding two dimensional function will be . How we will obtain a two dimensional image from this function? This is the question! We are going to define a matrix and store the values of for different pairs.
Basically, we divide the angle range 0-2 into M and N regions for x and y, respectively. Here is the images obtained using this approach and Matlab code.
1D Function |
Plot |
Function 2D |
2D Image |
|
|
Here are images for different k values. Values of k represents the level of frequency (from low to high) for k=0,….,20
1D Function |
Plot |
Function 2D |
2D Image |
|
|
||
|
|
|
|
|
|
||
|
|
|
|
|
|
||
|
|
|
|
|
|
||
|
|
|
|
Here is the Matlab code for this experiment.
clear all;
close all;
clc;
row=512;
col=512;
x =0:(2*pi/(col-1)):2*pi;
y =0:(2*pi/(row-1)):2*pi
k=1;
coskx = cos(k*x);
cosky = cos(k*y);
cosval = zeros(size(y,2),size(x,2));
for i=1:size(y,2)
for j=1:size(x,2)
cosval(i,j) = coskx(j)*coskx(i);
end
end
imshow(cosval,[])
figure, plot(x,coskx,'LineWidth',3)
hleg1 = legend('cos(x)');
grid on;
Similar to the 1D case, we can say that if the intensity values in an image changes dramatically, that image has high frequency components.