コード例 #1
0
ファイル: genLMS.py プロジェクト: bps10/color
def genLMS(spectrum, filters, fundamental='neitz', LMSpeaks=[559.0, 530.0, 419.0],
			remove_filters=True, normalize=True):
    '''
    '''
    if len(LMSpeaks) != 3:
        print 'LMSpeaks must be length 3! Using defaults: 559, 530, 417nm'
        LMSpeaks = [559.0, 530.0, 421.0]
 
    minLam = np.min(spectrum)
    maxLam = np.max(spectrum) 
    step = spectrum[1] - spectrum[0]

    if fundamental.lower() == 'stockman':
        sens = ss.stockmanfund(minLambda=minLam, maxLambda=maxLam, resolution=step)

        LS = sens[:, 0]
        MS = sens[:, 1]
        SS = sens[:, 2]

        Lresponse = LS * spectrum
        Mresponse = MS * spectrum
        Sresponse = SS * spectrum
        
    elif fundamental.lower() == 'stockspecsens':

        sens = ss.stockman(minLambda=minLam, maxLambda=maxLam, resolution=step)

        LS = sens[:, 0]
        MS = sens[:, 1]
        SS = sens[:, 2]
        
        Lresponse = LS / filters * spectrum
        Mresponse = MS / filters * spectrum
        Sresponse = SS / filters * spectrum
        
    elif fundamental.lower() == 'neitz':

        LS = ss.neitz(LMSpeaks[0], 0.5, False, minLam, 
                                         maxLam, step)
        MS = ss.neitz(LMSpeaks[1], 0.5, False, minLam, 
                                         maxLam, step)
        SS = ss.neitz(LMSpeaks[2], 0.4, False, minLam, 
                                         maxLam, step)
                            
        Lresponse = LS / filters * spectrum
        Mresponse = MS / filters * spectrum
        Sresponse = SS / filters * spectrum
    
    # normalize to peak at unity
    Lnorm = Lresponse / np.max(Lresponse)
    Mnorm = Mresponse / np.max(Mresponse)
    Snorm = Sresponse / np.max(Sresponse)

    if remove_filters and normalize:
    	return Lnorm, Mnorm, Snorm
    if remove_filters and not normalize:
    	return Lresponse, Mresponse, Sresponse
    if not remove_filters:
    	return LS, MS, SS
コード例 #2
0
ファイル: colorSpace.py プロジェクト: bps10/color
    def genTetraConvMatrix(self, Xpeak):
        '''
        '''
        self.setLights(self.param['stim'])        
        minspec = min(self.spectrum)
        maxspec = max(self.spectrum)
        Xsens = ss.neitz(Xpeak, 0.5, False, minspec, 
                                         maxspec, 1)
        Xresponse = Xsens / self.filters * self.spectrum
        Xnorm = Xresponse / np.max(Xresponse)
        
        lights = {'l': 600, 'm': 510, 's': 420, 'x': 720}
        convMatrix = np.array([
            [np.interp(lights['l'], self.spectrum, self.Lnorm),
            np.interp(lights['m'], self.spectrum, self.Lnorm),
            np.interp(lights['s'], self.spectrum, self.Lnorm),
            np.interp(lights['x'], self.spectrum, self.Lnorm)],

            [np.interp(lights['l'], self.spectrum, self.Mnorm),
            np.interp(lights['m'], self.spectrum, self.Mnorm),
            np.interp(lights['s'], self.spectrum, self.Mnorm),
            np.interp(lights['x'], self.spectrum, self.Mnorm)],

            [np.interp(lights['l'], self.spectrum, self.Snorm),
            np.interp(lights['m'], self.spectrum, self.Snorm),
            np.interp(lights['s'], self.spectrum, self.Snorm),
            np.interp(lights['x'], self.spectrum, self.Snorm)],

            [np.interp(lights['l'], self.spectrum, Xnorm),
            np.interp(lights['m'], self.spectrum, Xnorm),
            np.interp(lights['s'], self.spectrum, Xnorm),
            np.interp(lights['x'], self.spectrum, Xnorm)]])
        return convMatrix
コード例 #3
0
ファイル: analyze_LMratio.py プロジェクト: bps10/LM-Ratio
	def get_cones(self):
		'''
		'''
		L_cones = spect.neitz(LambdaMax=self.cones['L_peak'], 
			OpticalDensity=self.cones['L_OD'], 
			LOG=False, StartWavelength=self.spectrum[0], 
			EndWavelength=self.spectrum[-1], 
            resolution=1, EXTINCTION=False)
		M_cones = spect.neitz(LambdaMax=self.cones['M_peak'], 
			OpticalDensity=self.cones['M_OD'], 
			LOG=False, StartWavelength=self.spectrum[0], 
			EndWavelength=self.spectrum[-1], 
			resolution=1, EXTINCTION=False)

		M = M_cones * self.lens
		self.cones['M'] = M / M.max()
		L = L_cones * self.lens
		self.cones['L'] = L / L.max()
コード例 #4
0
ファイル: cones.py プロジェクト: bps10/base
def genReceptiveFields(freqs, cone_spacing, peaks=None, wvlen=None):
    """Create a difference of gaussians receptive field and plot it.

    :param excite_SD: standard deviation parameter of excitatory gaussian.
    :param inhibit_SD: standard deviation parameter of inhibitory \
    surround gaussian. Default = 5.0.

    :returns: RF_DOG, RF_SPLINE, FFT_RF

    """

    # traditional RF
    N = 300
    Xvals = np.arange(-15, 15, 10. / (2.0 * N))

    RF_DOG = []
    FFT_RF = []
    RField = []

    if peaks is not None and len(peaks) == 2 and wvlen is not None:

        K_excite = ss.neitz(LambdaMax=peaks[0], OpticalDensity=0.5, LOG=False,
                StartWavelength=wvlen, EndWavelength=wvlen, 
                resolution=1, EXTINCTION=False)
        K_inhibit = ss.neitz(LambdaMax=peaks[1], OpticalDensity=0.5, LOG=False,
                StartWavelength=wvlen, EndWavelength=wvlen, 
                resolution=1, EXTINCTION=False)
    else:
        K_excite, K_inhibit = 1, 1

    RF_DOG = findSpacing(Xvals, K_excite, K_inhibit, cone_spacing)
    FFT_RF = Fourier(RF_DOG, N)
    length = np.floor(FFT_RF.shape[0] / 2.) + 1
    RField = interpRField(freqs, Xvals[length:] * 60,
                             FFT_RF[length:])

    receptive_field = {
                            'length': length,
                            'dog': RF_DOG,
                            'coneResponse': FFT_RF,
                            'fft': RField,
                            'xvals': Xvals,
                            }
    return receptive_field
コード例 #5
0
ファイル: colorModel.py プロジェクト: bps10/color
    def genFirstStage(self, startLambda=390, endLambda=750, step=1,
                        Out='anti-log', OD=None):
        '''Compute the first stage in the model.

        '''
        if OD is None:
            OD = [0.4, 0.38, 0.33]

        lambdas = np.arange(startLambda, endLambda + step, step)

        L_cones = ss.neitz(LambdaMax=self.maxSens['l'], LOG=False,
                            StartWavelength=startLambda,
                            OpticalDensity=OD[0],
                            EndWavelength=endLambda, 
                            resolution=step)
        L_cones /= self.lensMacula * lambdas / lambdas[-1]
        
        M_cones = ss.neitz(LambdaMax=self.maxSens['m'], LOG=False,
                            StartWavelength=startLambda,
                            OpticalDensity=OD[1],
                            EndWavelength=endLambda, 
                            resolution=step)
        M_cones /= self.lensMacula * lambdas / lambdas[-1]
        
        S_cones = ss.neitz(LambdaMax=self.maxSens['s'], LOG=False,
                            StartWavelength=startLambda,
                            OpticalDensity=OD[2],
                            EndWavelength=endLambda, 
                            resolution=step)

        S_cones /= self.lensMacula * lambdas / lambdas[-1]

        self.FirstStage = {
            'lambdas': lambdas,
            'wavelen': {'startWave': startLambda, 'endWave': endLambda,
                        'step': step, },
            'L_cones': L_cones,
            'M_cones': M_cones,
            'S_cones': S_cones,
            }
コード例 #6
0
ファイル: analyze_LMratio.py プロジェクト: bps10/LM-Ratio
	def diff_sens(self, curve):
		'''
		'''
		# maximum possible
		fake_cone = spect.neitz(
			LambdaMax=self.spectrum[self.LED['ind0']], 
			OpticalDensity=0.3, 
			LOG=False, 
			StartWavelength=self.spectrum[0], 
			EndWavelength=self.spectrum[-1], 
            resolution=1, EXTINCTION=False)

		norm = (np.sum(fake_cone * self.LED['ref']) / 
			np.sum(curve * self.LED['ref']))

		return norm
コード例 #7
0
ファイル: test_spectsens.py プロジェクト: bps10/base
 def test_neitz(self):
     
     sens = sp.neitz(LambdaMax=559, OpticalDensity=0.5, LOG=False,
             StartWavelength=390, EndWavelength=770, resolution=1)
     self.assertTrue(len(sens) == 381)
     self.assertTrue(round(np.max(sens), 2) == 1.0)