In [1]:
import os
import numpy as np
import matplotlib.pyplot as plt
from skimage import io, transform
from psyutils.image import show_im
import psyutils as pu
%load_ext autoreload
%autoreload 2
%matplotlib inline
In [2]:
# load a test image:
im = pu.im_data.orientation_test()
show_im(im)
In [3]:
# show the spectrum:
A, P, F = pu.image.spectral_analysis_fft(im)
show_im(np.log(A))
In [4]:
# take spectral power:
d = pu.image.spectral_analysis(im)
# plot:
pu.image.spectral_analysis_plot(d)
In [5]:
x, y = pu.image.axes_cart(128)
im = np.sin(x * 8 * np.pi)
show_im(im)
In [6]:
A, P, F = pu.image.spectral_analysis_fft(im)
show_im(A)
In [7]:
d = pu.image.spectral_analysis(im)
# plot:
pu.image.spectral_analysis_plot(d)
In [8]:
x, y = pu.image.axes_cart(128)
im = np.sin(y * 8 * np.pi)
show_im(im)
In [9]:
A, P, F = pu.image.spectral_analysis_fft(im)
show_im(A)
In [10]:
d = pu.image.spectral_analysis(im)
# plot:
pu.image.spectral_analysis_plot(d)
In [11]:
x, y = pu.image.axes_cart(128, angle = 45)
im = np.sin(y * 8 * np.pi)
show_im(im)
In [12]:
A, P, F = pu.image.spectral_analysis_fft(im)
show_im(A)
In [13]:
d = pu.image.spectral_analysis(im, sf_band=1, ori_band=5)
# plot:
pu.image.spectral_analysis_plot(d)
In [14]:
im = pu.im_data.single_bar()
show_im(im)
In [15]:
A, P, F = pu.image.spectral_analysis_fft(im)
show_im(np.log(A))
In [16]:
d = pu.image.spectral_analysis(im)
# plot:
pu.image.spectral_analysis_plot(d)
In [17]:
# horizontal
im = transform.rotate(pu.im_data.single_bar(), 90, cval = 0.5)
show_im(im)
In [18]:
A, P, F = pu.image.spectral_analysis_fft(im)
show_im(np.log(A))
In [19]:
d = pu.image.spectral_analysis(im)
# plot:
pu.image.spectral_analysis_plot(d)
In [20]:
# +45
im = transform.rotate(pu.im_data.single_bar(), 45, cval = 0.5)
show_im(im)
In [21]:
A, P, F = pu.image.spectral_analysis_fft(im)
show_im(np.log(A))
In [22]:
d = pu.image.spectral_analysis(im)
# plot:
pu.image.spectral_analysis_plot(d)
In [23]:
# opposite phase:
im = transform.rotate(pu.im_data.single_bar(), 225, cval = 0.5)
show_im(im)
In [24]:
A, P, F = pu.image.spectral_analysis_fft(im)
show_im(np.log(A))
In [25]:
d = pu.image.spectral_analysis(im)
# plot:
pu.image.spectral_analysis_plot(d)
In [26]:
# -45
im = transform.rotate(pu.im_data.single_bar(), -45, cval = 0.5)
show_im(im)
In [27]:
A, P, F = pu.image.spectral_analysis_fft(im)
show_im(np.log(A))
In [28]:
d = pu.image.spectral_analysis(im)
# plot:
pu.image.spectral_analysis_plot(d)
In [29]:
im = pu.image.gabor_create(orientation = np.pi/2)
show_im(im.real)
In [30]:
A, P, F = pu.image.spectral_analysis_fft(im.real)
show_im(np.log(A))
In [31]:
d = pu.image.spectral_analysis(im.real, ori_step = 1, ori_band = 10)
# plot:
pu.image.spectral_analysis_plot(d)
In [32]:
im = pu.image.gabor_create(orientation = 0)
show_im(im.real)
In [33]:
A, P, F = pu.image.spectral_analysis_fft(im.real)
show_im(np.log(A))
In [34]:
d = pu.image.spectral_analysis(im.real)
# plot:
pu.image.spectral_analysis_plot(d)
In [35]:
im = pu.image.gabor_create(orientation = np.pi/4)
show_im(im.real)
In [36]:
A, P, F = pu.image.spectral_analysis_fft(im.real)
show_im(np.log(A))
In [37]:
d = pu.image.spectral_analysis(im.real)
# plot:
pu.image.spectral_analysis_plot(d)
In [38]:
# test a more complex image:
im = pu.im_data.tiger_grey()
show_im(im)
In [39]:
A, P, F = pu.image.spectral_analysis_fft(im)
show_im(np.log(A))
In [40]:
x = np.linspace(-A.shape[1]//2, A.shape[1]//2, num=A.shape[1])
plt.plot(x, np.log(A[A.shape[0]//2, :]));
In [41]:
d = pu.image.spectral_analysis(im)
# plot:
pu.image.spectral_analysis_plot(d)
Note how the (log) mean amplitude averaged by my analysis function corresponds to the mean of the (log) amplitudes in the fourier spectrum. No weird normalisation going on.
In [42]:
im = pu.im_data.tiger_grey()
show_im(im)
In [43]:
A, P, F = pu.image.spectral_analysis_fft(im)
In [44]:
show_im(np.log(A))
In [45]:
mask = pu.image.make_filter_gaussian(A.shape, peak=1, width=4, zero_mean=True)
show_im(mask)
In [46]:
plt.plot(mask[mask.shape[0]//2, 100:150]);
In [47]:
sf_band = 1
sf_step = 10
finished = 0
inc = 0
freq = []
freq_amp = []
while finished == 0:
peak = 1 + inc # start from 1 cpi
freq.append(peak) # this frequency centre
mask = pu.image.make_filter_gaussian(A.shape, peak=peak,
width=sf_band,
pixel_units=True,
zero_mean=True)
mask[mask < 0.01] = 0 # cut tails of Gaussian
# mask = pu.image.make_filter_log_cosine(A.shape, peak=peak,
# pixel_units=True,
# zero_mean=True)
res = A * mask
# take mean of nonzero region:
mean = np.mean(res[res > 0])
freq_amp.append(mean)
inc += sf_step # in pixel unit of radial increments (cpi).
if peak >= A.shape[0]/2:
# if freq greater than or equal to nyquist:
finished = 1
plt.figure()
plt.title("Inc = {} \n peak = {} \n mean = {}".format(inc, peak,
mean))
plt.imshow(mask * np.log(A)); plt.grid("off")
In [48]:
filt = pu.image.make_filter_orientation_gaussian(A.shape,
peak=360,
width=10,
symmetric=False,
pixel_units=True,
zero_mean=True)
show_im(filt)
In [49]:
ori_band = 12
ori_step = 36
symmetric = False
finished = 0
inc = 0
ang = []
ang_amp = []
if symmetric is True:
# bowtie, running 0-180
end_angle = 180
elif symmetric is False:
end_angle = 360
while finished == 0:
peak = 0 + inc
ang.append(peak)
mask = pu.image.make_filter_orientation_gaussian(A.shape,
peak=peak,
width=ori_band,
symmetric=symmetric,
pixel_units=True,
zero_mean=True)
# this average amplitude:
ang_amp.append(np.mean(A * mask))
inc += ori_step
if peak >= end_angle:
finished = 1
plt.figure()
plt.title("Inc = {} \n peak = {} \n mean = {}".format(inc, peak,
np.mean(A * mask)))
plt.imshow(mask * np.log(A)); plt.grid("off")
In [50]:
# convert degrees to radians:
ang = np.array(ang, dtype=np.float)
ang /= (180 / np.pi)
ang
Out[50]:
In [51]:
ax = plt.axes(projection = "polar")
ax.plot(ang, ang_amp);