% % flVct = Edge_contrast_1D( flHalfWidth, ndegPhase ) % ------------------------------------------------------------------------- % % Creates vector with a center-surround aura and edge at a given angle. % This vector is used as a member of a sequence. % % USAGE: flVct = Edge_contrast_1D( 13.3, 20 ); % % INPUT: % % flHalfWidth - % ndegPhase - Phase angle, in degrees % % HARDCODED (immediately below function declaration): % % nOverSample - [1, 16] Flat aperture oversampling rate. % bShowResult - [0, 1] Show progress, display final image. % % RETURN VALUES: % % flVct = range [0,1], length 2*ceil( flHalfWidth ) % % FUNCTION CALLS and DEPENDENCIES: % % None. % % Mark Dow, November 11, 2008 % Mark Dow, modified , 2008 () % % % TERMS FOR USE: There are no restrictions on the use of this code, % auxilliary code and other required resources. Claiming % to be the originator, explicitly or implicitly, is bad % karma. A link (if appropriate), a note to dow[at]uoregon.edu, % and credit are appreciated but not required. % function flVct = Edge_contrast_1D( flHalfWidth, ndegPhase ) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % hardcoded parameters nOverSample = 16; % Approximate flat aperture sampling % with high integer oversampling. bTilingEdge = true; bShowResult = false; % [0,1] ndegPhase = ndegPhase + 280; % I don't know why. ndegPhase = mod( ndegPhase, 360 ); % hardcoded parameters %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Initialize gray nWOS = nOverSample*2*ceil( flHalfWidth ); % flVct ( 1 : 2*ceil( flHalfWidth ) ) = -.5; % flVctOS( 1 : nWOS ) = -.5; flVct ( 1 : 2*ceil( flHalfWidth ) ) = 0; flVctOS( 1 : nWOS ) = 0; flInterval = .5/(flHalfWidth*nOverSample); % Background profile: % Triangular peak [ 0, .5 ]: % ramp = .5: -flInterval : flInterval; ramp = 1 : -flInterval : flInterval + .5; % ramp = flInterval : flInterval : .5; % Zero fill right end. lRamp = length(ramp); nZeroEnds = nWOS/2 - lRamp; if nZeroEnds > 0 ramp( lRamp + 1 : nWOS/2 ) = 0; end rampUp = fliplr( ramp ); flVctOS( 1 : nWOS/2 ) = flVctOS( 1 : nWOS/2 ) + rampUp; % flVctOS( 1 : nWOS/2 ) = flVctOS( 1 : nWOS/2 ) - .5; rampDn = ramp; flVctOS( nWOS/2 + 1 : nWOS ) = flVctOS( nWOS/2 + 1 : nWOS ) + rampDn; % flVctOS( nWOS/2 + 1 : nWOS ) = flVctOS( nWOS/2 + 1 : nWOS ) - .5; % Peridic fence: flFenceOS( 1 : nWOS ) = 1; % flFenceOS( 1*nWOS/2 + 1 : 2*nWOS/2 ) = -1; % flFenceOS( 3*nWOS/2 + 1 : 4*nWOS/2 ) = -1; % flFenceOS( nZeroEnds + round( 1*lRamp/2 ) + 1 : nZeroEnds + round( 2*lRamp/2 ) ) = -1; % flFenceOS( nZeroEnds + round( 3*lRamp/2 ) + 1 : nZeroEnds + round( 4*lRamp/2 ) ) = -1; flFenceOS( nZeroEnds + round( 1*lRamp/2 ) + 1 : nZeroEnds + round( 2*lRamp/2 ) ) = 0; flFenceOS( nZeroEnds + round( 3*lRamp/2 ) + 1 : nZeroEnds + round( 4*lRamp/2 ) ) = 0; % Cycle fence: nCycle = round( nOverSample*2*flHalfWidth*ndegPhase/360 + 0 ); if nCycle > 0 flFenceTemp( nZeroEnds + ( 2*lRamp - nCycle ) + 1 : nZeroEnds + 2*lRamp ) = flFenceOS( nZeroEnds + 1 : nZeroEnds + nCycle ); flFenceTemp( nZeroEnds + 1 : nZeroEnds + 2*lRamp - nCycle ) = flFenceOS( nZeroEnds + nCycle + 1 : nZeroEnds + 2*lRamp ); % Zero fill right end. if nZeroEnds > 0 flFenceTemp( nZeroEnds + 2*lRamp + 1 : nWOS ) = 0; end flFenceOS = flFenceTemp; end % Convolve background with fence: flVctOS = flVctOS .* flFenceOS; % flVctOS = flVctOS + .5; flVctOS = flVctOS + 0; % Flat aperture block undersample: for iOS = 1:2*ceil( flHalfWidth ) if bTilingEdge wrapI = nZeroEnds - ( 0 + (iOS-1)*nOverSample ) + 0; wrapF = iOS*nOverSample - ( nWOS - nZeroEnds ) + 0; if wrapI > 0 flVct( iOS ) = ( sum( flVctOS( 1 + (iOS-1)*nOverSample + wrapI : iOS*nOverSample ) ) ... + sum( flVctOS( ( nWOS - nZeroEnds ) - wrapI : ( nWOS - nZeroEnds ) - 1 ) ) )/nOverSample; else if wrapF > 0 flVct( iOS ) = ( sum( flVctOS( 1 + (iOS-1)*nOverSample : iOS*nOverSample - wrapF ) ) ... + sum( flVctOS( 1 + nZeroEnds : nZeroEnds + wrapF ) ) )/nOverSample; else flVct( iOS ) = sum( flVctOS( 1 + (iOS-1)*nOverSample : iOS*nOverSample ) )/nOverSample; end end else flVct( iOS ) = sum( flVctOS( 1 + (iOS-1)*nOverSample : iOS*nOverSample ) )/nOverSample; end % if ( 1 + (iOS-1)*nOverSample ) < nZeroEnds ... % && iOS*nOverSample > nZeroEnds ... % && sum( flVctOS( 1 + (iOS)*nOverSample : (iOS+1)*nOverSample ) )/nOverSample < 0.01 % flVct( iOS ) = 0; % end % if ( 1 + (iOS-1)*nOverSample ) < nZeroEnds + 2*lRamp ... % && iOS*nOverSample > nZeroEnds + 2*lRamp ... % && flVct( iOS - 1 ) < 0.01 % % flVct( iOS ) = 0; % end end if bShowResult nim = zeros( 2*ceil( flHalfWidth ), 2*ceil( flHalfWidth ) ); for i = 1 : 2*ceil( flHalfWidth ) nim( i, : ) = flVct; end figure imshow( nim ); colormap( gray ) end