%%%%%
Compare Martin's with Qian's model
%%%%%
Martin: convolves phase-shifted flicker filters with image in left and right
eye (simple cell)
%%%%%
integrates over space and add squared input (complex cell)
%%%%%
Qian : convolves phase-shifted
motion filters with image in left and right eye (simple cell)
%%%%%
integrate over space and add squared input (complex cell)
%%%%%
by A Dolia and M Lages
%%%%%
TO DO:
%%%%%
make activation of flicker direction-selective
%%%%%
smaller receptive fields tuned to left and right motion
%%%%%
shift receptive fields according to stimulus phase shift of -pi/4...+pi/4
%%%%%
adjust filter size and position
%%%%%
5 December 2003
%function
[ComplexCell, maxv, maxi ] = StereoGaborWaveletV2(LeftImage, RightImage,
Gabor_options)
%
--------------- general settings ---------------------
clear
all;
close
all;
SpatialFrequency = 0.75; % was 1.0 cycle per unit
SpatialSize
= 1.0; %
SD of spatial envelope
SpatialStep
= 0.1;
LeftLimit = -5.0;
RightLimit
= 5.0;
TemporalFrequency =
0.75;
TemporalSize = 1.0; % SD of temporal
envelope
TemporalStep = 0.1;
LowLimit =
-5.0;
TopLimit = 5.0;
PhaseX
= 0; % stimulus phase shift
varied between -pi/2 and +pi/2
%
Spatial and temporal extent
[filter_x_location,filter_y_location]
= meshgrid(LowLimit : TemporalStep: TopLimit, LeftLimit: SpatialStep:
RightLimit);
x
= filter_x_location;
y
= filter_y_location;
filter_bufL
= (x).^2/(2*SpatialSize^2) + y.^2/(2*TemporalSize^2); % +0.25 equivalent to +pi/4??
filter_bufR
= (x).^2/(2*SpatialSize^2) + y.^2/(2*TemporalSize^2); % -0.25 equivalent to -pi/4??
filter_envelopeL =
exp(-filter_bufL);
filter_envelopeR =
exp(-filter_bufR);
%
Stimulus input to left and right eye
LeftImage = cos((2*pi*SpatialFrequency ) .* x -
(2*pi*TemporalFrequency ) .* y +
PhaseX/2);
RightImage
= cos((2*pi*SpatialFrequency ) .* x - (2*pi*TemporalFrequency ) .* y - PhaseX/2);
%LeftImageSpectra = fft2(LeftImage);
%RightImageSpectra
= fft2(RightImage);
%j
= sqrt(-1);
ndepth
= 24; % number of depth planes
delta_phase
= pi/(ndepth-1); %
pi/(ndepth-1) % extent in depth
(rad)
for
jj=1: ndepth
phase_diff = -0.5 * pi + (jj-1) *
delta_phase; % -pi/2 to + pi/2
%PhaseL =
-pi/2.0
+ phase_diff;
%PhaseR =
-pi/2.0
- phase_diff;
PhaseL = phase_diff/2;
PhaseR =
-phase_diff/2;
%%%%%%%%%%%%%%% Martin's flicker filters
(no motion)
%%%% positive velocity cos A + cos B = 2
cos( (A+B)/2 )cos( (A-B)/2)
MP_Left_cos_filter = 2 * filter_envelopeL .*
cos((2*pi*SpatialFrequency ) .* x + PhaseL) .* ...
cos((2*pi*TemporalFrequency ) .* y );
MP_Right_cos_filter = -2 * filter_envelopeR .*
sin((2*pi*SpatialFrequency ) .* x + PhaseR) .* ...
sin((2*pi*TemporalFrequency ) .* y );
%%%% positive velocity sin A + sin B = 2
sin( (A+B)/2 )cos( (A-B)/2)
MP_Left_sin_filter = 2 * filter_envelopeL .*
sin((2*pi*SpatialFrequency ) .* x + PhaseL) .* ...
cos((2*pi*TemporalFrequency ) .* y );
MP_Right_sin_filter = 2 * filter_envelopeR .*
cos((2*pi*SpatialFrequency ) .* x + PhaseR) .* ...
sin((2*pi*TemporalFrequency ) .* y );
MP_cos_simple_cell =
zeros(201,1);
MP_sin_simple_cell =
zeros(201,1);
% convolve image with filter over time
then add over space
for i=1:101
MP_cos_simple_cell
= MP_cos_simple_cell + conv(LeftImage(:,i),MP_Left_cos_filter(:,i)) +
conv(RightImage(:,i),MP_Right_cos_filter(:,i));
MP_sin_simple_cell
= MP_sin_simple_cell + conv(LeftImage(:,i),MP_Left_sin_filter(:,i)) +
conv(RightImage(:,i),MP_Right_sin_filter(:,i));
end
% complex cell - squared input
MP_ComplexCell{jj} = MP_cos_simple_cell
.* MP_cos_simple_cell + MP_sin_simple_cell .* MP_sin_simple_cell;
%%%%%%%%%%%%%%%%%%% Qian's motion
filters (no flicker)
QP_Left_cos_filter = filter_envelopeL
.* cos( 2*pi*SpatialFrequency .* x + PhaseL + ...
2*pi*TemporalFrequency .* y
);
QP_Right_cos_filter= filter_envelopeR
.* cos( 2*pi*SpatialFrequency .* x + PhaseR + ...
2*pi*TemporalFrequency .* y
);
QP_Left_sin_filter = filter_envelopeL
.* sin( 2*pi *
SpatialFrequency .* x + PhaseL +
...
2*pi
* TemporalFrequency .*
y
);
QP_Right_sin_filter= filter_envelopeR
.* sin( 2*pi*SpatialFrequency .* x + PhaseR + ...
2*pi*TemporalFrequency .* y
);
QP_cos_simple_cell
= zeros(201,1);
QP_sin_simple_cell
= zeros(201,1);
for i=1:101 % add over space
% convolve
image with filter over time (columns)
QP_cos_simple_cell
= QP_cos_simple_cell + conv(LeftImage(:,i),QP_Left_cos_filter(:,i)) +
conv(RightImage(:,i),QP_Right_cos_filter(:,i));
QP_sin_simple_cell
= QP_sin_simple_cell + conv(LeftImage(:,i),QP_Left_sin_filter(:,i)) +
conv(RightImage(:,i),QP_Right_sin_filter(:,i));
end
% complex cell with squared input
QP_ComplexCell{jj} =
(QP_cos_simple_cell) .* (QP_cos_simple_cell) + QP_sin_simple_cell .*
QP_sin_simple_cell;
end % for jj
%%%%%%
Determine max activity and depth plane for Martin's model
MP_maxv
= MP_ComplexCell{1};
MP_minv
= MP_ComplexCell{1};
MP_maxi
= ones(201,1);
MP_maxv_depth
= 1;
%ones(size(MP_cos_simple_cell,1));
for
jj=2:ndepth
MP_max_value=max(MP_maxv);
for i_row=1 :
size(MP_cos_simple_cell,1)
% for i_col=1 :
size(LeftImage,2)
if
MP_ComplexCell{jj}(i_row) > MP_maxv(i_row)
MP_maxv(i_row) = MP_ComplexCell{jj}(i_row); % sample max over depths at given time (i_row)
MP_maxi(i_row) = jj;
end % if
if
MP_ComplexCell{jj}(i_row) > MP_max_value % find highest overall value
MP_max_value = MP_ComplexCell{jj}(i_row);
MP_maxv_depth = jj;
end % if
if
MP_ComplexCell{jj}(i_row) < MP_minv(i_row)
MP_minv(i_row) = MP_ComplexCell{jj}(i_row);
end % if
% end % i_col
end % i_row
end;
% jj
%%%%%%
Determine max activity and depth plane for Qian's model
QP_maxv
= QP_ComplexCell{1};
QP_minv
= QP_ComplexCell{1};
QP_maxi
= ones(201,1);
QP_maxv_depth
= 1;
for
jj=2:ndepth
QP_max_value=max(QP_maxv);
for i_row=1 :
size(QP_cos_simple_cell,1)
% for i_col=1 :
size(LeftImage,2)
if
QP_ComplexCell{jj}(i_row) > QP_maxv(i_row)
QP_maxv(i_row) = QP_ComplexCell{jj}(i_row);
QP_maxi(i_row) = jj;
end % if
if
QP_ComplexCell{jj}(i_row) > QP_max_value % find highest overall value
QP_max_value = QP_ComplexCell{jj}(i_row);
QP_maxv_depth = jj;
end % if
if
QP_ComplexCell{jj}(i_row) < QP_minv(i_row)
QP_minv(i_row) = QP_ComplexCell{jj}(i_row);
end % if
% end % i_col
end % i_row
end;
% jj
%
QP_max_value = max(QP_maxv);
%
QP_min_value = min(QP_minv);
%
%
figure;
%
subplot(2,2,1); imshow(mat2gray(Left_cos_filter ), [0 1]);
%
subplot(2,2,2); imshow(mat2gray(Right_cos_filter), [0 1]);
%
subplot(2,2,3); imshow(mat2gray(Left_sin_filter ), [0 1]);
%
subplot(2,2,4); imshow(mat2gray(Right_sin_filter), [0 1]);
%figure;
%for
jj=1:ndepth
% subplot(5,5, jj); imshow(
mat2gray(ComplexCell{jj}/max_value), [0 1]);
%end
row
= size(MP_ComplexCell{jj},1);
col
= size(MP_ComplexCell{jj},2);
max_value
= max([MP_max_value, QP_max_value]); %MN_max_value]) %; QP_max_value;
QN_max_value])
%
figure;
%
for jj=1:ndepth
% subplot(5,5, jj);
plot(MP_ComplexCell{jj}(:, round(col/2) ) ); axis([1 row 0 max_value]);
%
end
%
xlabel('space'); ylabel('time'); title('MP, Com. cell');
%
%
figure;
%
for jj=1:ndepth
% subplot(5,5, jj);
plot(MN_ComplexCell{jj}(:, round(col/2) ) ); axis([1 row 0 max_value]);
%
end
%
xlabel('space'); ylabel('time'); title('MN, Com. cell');
%
%
figure;
%
for jj=1:ndepth
% subplot(5,5, jj);
plot(QP_ComplexCell{jj}(:, round(col/2) ) ); axis([1 row 0 max_value]);
%
end
%
xlabel('space'); ylabel('time'); title('QP, Com. cell');
%
%
figure;
%
for jj=1:ndepth
% subplot(5,5, jj);
plot(QN_ComplexCell{jj}(:, round(col/2) ) ); axis([1 row 0 max_value]);
%
end
%
xlabel('space'); ylabel('time'); title('QN, Com. cell');
%subplot(5,5,
25); imshow(mat2gray(maxv), [0 1]);
figure;
subplot(5,2,1)
; imshow(mat2gray(LeftImage ), [0 1]);
subplot(5,2,2)
; imshow(mat2gray(RightImage), [0 1]);
subplot(5,2,3);
imshow(mat2gray(MP_ComplexCell{MP_maxv_depth}), [0 1]);
subplot(5,2,4);
imshow(mat2gray(QP_ComplexCell{QP_maxv_depth}), [0 1]);
subplot(5,2,5)
; plot(MP_maxv); axis([1 row 0 MP_max_value]); xlabel('time');
ylabel('activation'); title('Martin, Complex Cells, MPos');
subplot(5,2,6)
; plot(MP_maxi); axis([1 row 1 ndepth ]); xlabel('time'); ylabel('depth (index)');
title('Martin, Index, MPos');
subplot(5,2,7)
; plot(QP_maxv); axis([1 row 0 QP_max_value]); xlabel('time'); ylabel('activation');
title('Qian, Com. Cells, MP');
subplot(5,2,8)
; plot(QP_maxi); axis([1 row 1 ndepth ]); xlabel('time'); ylabel('depth (index)');
title('Qian, Index, MP');
%
subplot(5,2,7) ; plot(MN_maxv(round(col/2),:)); axis([1 row 0 max_value]);
xlabel('time'); %ylabel('activation');title('Martin, Complex Cells, MNeg');
%
subplot(5,2,8) ; plot(MN_maxi(round(col/2),:)); axis([1 row 1 ndepth ]); xlabel('time'); ylabel('depth
%(index)');title('Martin, Index, MNeg');
%
%
subplot(5,2,9) ; plot(QN_maxv(round(col/2),:)); axis([1 row 0 max_value]);
xlabel('time'); ylabel('activation'); %title('Qian, Com. Cells, QN');
%
subplot(5,2,10); plot(QN_maxi(round(col/2),:)); axis([1 row 1 ndepth ]); xlabel('time'); ylabel('depth
%(index)'); title('Qian, Index, QN');