Beispiel #1
0
 def _filter(self, FT):
     """ Helper function to apply Butterworth filter in 
         frequensy domain.
     """
     filterSize = numpy.max(self._size)
     pin=filters.makeRadialMatrix(matrixSize=filterSize, center=(0,0), radius=1.0)
     pin[int(filterSize / 2)][int(filterSize / 2)] = 0.00000001  # Prevents divide by zero error. This is DC and is set to zero later anyway.
     FT = numpy.multiply(FT,(pin) ** self.noiseFractalPower)
     if self.noiseFilterOrder > 0.01:
         if self._upsf<(filterSize/2.0):
             filter = filters.butter2d_lp_elliptic(size = [filterSize,filterSize], 
                                                         cutoff_x = self._upsf / filterSize, 
                                                         cutoff_y = self._upsf / filterSize, 
                                                         n=self.noiseFilterOrder, 
                                                         alpha=0, 
                                                             offset_x = 0.5/filterSize,  #becuase FFTs are slightly off centred.
                                                             offset_y = 0.5/filterSize)
         else:
             filter = numpy.ones((int(filterSize),int(filterSize)))
         if self._lowsf > 0:
             if self._lowsf > filterSize/2:
                 msg = ('Lower cut off frequency for filtered '
                 'noise is too high (exceeds Nyquist limit).')
                 raise Warning(msg)
             filter = filter-filters.butter2d_lp_elliptic(size = [filterSize,filterSize], 
                                                             cutoff_x = self._lowsf / filterSize, 
                                                             cutoff_y = self._lowsf / filterSize, 
                                                             n = self.noiseFilterOrder, 
                                                             alpha = 0, 
                                                             offset_x = 0.5/filterSize, #becuase FFTs are slightly off centred.
                                                             offset_y = 0.5/filterSize)
         return FT * filter
     else:
         return FT
Beispiel #2
0
 def _filter(self, FT):
     """ Helper function to apply Butterworth filter in 
         frequensy domain.
     """
     filterSize = numpy.max(self._size)
     pin = filters.makeRadialMatrix(matrixSize=filterSize,
                                    center=(0, 0),
                                    radius=1.0)
     pin[int(filterSize / 2)][int(
         filterSize / 2
     )] = 0.00000001  # Prevents divide by zero error. This is DC and is set to zero later anyway.
     FT = numpy.multiply(FT, (pin)**self.noiseFractalPower)
     if self.noiseFilterOrder > 0.01:
         if self._upsf < (filterSize / 2.0):
             filter = filters.butter2d_lp_elliptic(
                 size=[filterSize, filterSize],
                 cutoff_x=self._upsf / filterSize,
                 cutoff_y=self._upsf / filterSize,
                 n=self.noiseFilterOrder,
                 alpha=0,
                 offset_x=0.5 /
                 filterSize,  #becuase FFTs are slightly off centred.
                 offset_y=0.5 / filterSize)
         else:
             filter = numpy.ones((int(filterSize), int(filterSize)))
         if self._lowsf > 0:
             if self._lowsf > filterSize / 2:
                 msg = ('Lower cut off frequency for filtered '
                        'noise is too high (exceeds Nyquist limit).')
                 raise Warning(msg)
             filter = filter - filters.butter2d_lp_elliptic(
                 size=[filterSize, filterSize],
                 cutoff_x=self._lowsf / filterSize,
                 cutoff_y=self._lowsf / filterSize,
                 n=self.noiseFilterOrder,
                 alpha=0,
                 offset_x=0.5 /
                 filterSize,  #becuase FFTs are slightly off centred.
                 offset_y=0.5 / filterSize)
         return FT * filter
     else:
         return FT
Beispiel #3
0
    def buildNoise(self):
        """build a new noise sample. Required to act on changes to any noise parameters or texRes.
        """

        if self.units == 'pix':
            if not (self.noiseType in ['Binary','binary','Normal','normal','uniform','Uniform']):
                mysize = numpy.max(self.size)
            else:
                mysize = self.size
            sampleSize = self.noiseElementSize
            mysf = self.__dict__['noiseBaseSf']*mysize
            lowsf = self.noiseFilterLower*mysize
            upsf = self.noiseFilterUpper*mysize
        else:
            mysize = self.texRes
            pixSize = self.size/self.texRes
            sampleSize = self.noiseElementSize/pixSize
            mysf = self.size[0]*self.noiseBaseSf
            lowsf = self.size[0]*self.noiseFilterLower
            upsf = self.size[0]*self.noiseFilterUpper
       
        self._size = mysize  # store for use by updateNoise()
        self._sf = mysf
        if self.noiseType in ['binary','Binary','normal','Normal','uniform','Uniform']:
            self._sideLength = numpy.round(mysize/sampleSize)  # dummy side length for use when unpacking noise samples in updateNoise()
            self._sideLength.astype(int)
            if ((self._sideLength[0] < 2) and (self._sideLength[1] < 2)):
                msg=('Noise sample size '
                     'must result in more than '
                     '1 sample per image dimension.')
                raise ValueError(msg)
            totalSamples = self._sideLength[0]*self._sideLength[1]
            if self.noiseType in ['binary','Binary']:
                self.noiseTex=numpy.append(numpy.ones(int(numpy.round(totalSamples/2.0))),-1*numpy.ones(int(numpy.round(totalSamples/2.0))))
        elif self.noiseType in ['White','white']:
            self.noiseTex = numpy.ones((int(mysize),int(mysize)))
            self.noiseTex[0][0] = 0
        #elif self.noiseType in ['Coloured','coloured']:
        #    pin=filters.makeRadialMatrix(matrixSize=mysize, center=(0,0), radius=1.0)
        #    self.noiseTex=numpy.multiply(numpy.ones((int(mysize),int(mysize))),(pin)**self.noiseFractalPower) 
        #    self.noiseTex=fftshift(self.noiseTex)
        #    self.noiseTex[0][0]=0
        elif self.noiseType in ['Isotropic','isotropic']:
            if mysf > mysize/2:
                msg = ('Base frequency for isotropic '
                      'noise is definitely too high.')
                raise Warning(msg)
            localf = mysf/mysize
            linbw = 2**self.noiseBW
            lowf = 2.0*localf/(linbw+1.0)
            highf = linbw*lowf
            FWF = highf-lowf
            sigmaF = FWF/(2*numpy.sqrt(2*numpy.log(2)))
            self.noiseTex = numpy.zeros(int(mysize**2))
            self.noiseTex = numpy.reshape(self.noiseTex,(int(mysize),int(mysize)))
            pin = filters.makeRadialMatrix(matrixSize=mysize, center=(0,0), radius=2)
            self.noiseTex = filters.makeGauss(pin, mean=localf, sd=sigmaF)
            self.noiseTex = fftshift(self.noiseTex)
            self.noiseTex[0][0] = 0
        elif self.noiseType in ['Gabor','gabor']:
            if mysf > mysize/2:
                msg = ('Base frequency for Gabor '
                      'noise is definitely too high.')
                raise Warning(msg)
            localf = mysf/mysize
            linbw = 2**self.noiseBW
            lowf = 2.0*localf/(linbw+1.0)
            highf = linbw*lowf
            FWF = highf-lowf
            sigmaF = FWF/(2*numpy.sqrt(2*numpy.log(2)))
            FWO = 2.0*localf*numpy.tan(numpy.pi*self.noiseBWO/360.0)
            sigmaO = FWO/(2*numpy.sqrt(2*numpy.log(2)))
            self.noiseTex=numpy.zeros(int(mysize**2))
            self.noiseTex=numpy.reshape(self.noiseTex,(int(mysize),int(mysize)))
            yy, xx = numpy.mgrid[0:mysize, 0:mysize]
            xx = (0.5 - 1.0 / mysize * xx) 
            yy = (0.5 - 1.0 / mysize * yy) 
            self.noiseTex=filters.make2DGauss(xx,yy,mean=(localf,0), sd=(sigmaF,sigmaO))
            self.noiseTex=self.noiseTex+filters.make2DGauss(xx,yy, mean=(-localf,0), sd=(sigmaF,sigmaO))
            self.noiseTex=fftshift(self.noiseTex)
            self.noiseTex[0][0]=0
        elif self.noiseType in ['Image','image']:
            if not(self.noiseImage in ['None','none']):  
                im = Image.open(self.noiseImage)
                im = im.transpose(Image.FLIP_TOP_BOTTOM)
                im = im.convert("L")  # FORCE TO LUMINANCE
                intensity = numpy.array(im).astype(
                        numpy.float32) * 0.0078431372549019607 - 1.0
                self.noiseTex =  numpy.absolute(fft2(intensity))
            else:
                self.noiseTex = numpy.ones((int(mysize),int(mysize)))  # if image is 'None' will make white noise as tempary measure
            self.noiseTex[0][0]=0
        elif self.noiseType in ['filtered','Filtered']:
            pin=filters.makeRadialMatrix(matrixSize=mysize, center=(0,0), radius=1.0)
            self.noiseTex = numpy.multiply(numpy.ones((int(mysize),int(mysize))),(pin)**self.noiseFractalPower)
            if lowsf > mysize/2:
                msg = ('Lower cut off frequency for filtered '
                      'noise is definitely too high.')
                raise Warning(msg)
            if self.noiseFilterOrder > 0.01:
                if upsf<(mysize/2.0):
                    filter = filters.butter2d_lp_elliptic(size=[mysize,mysize], cutoff_x=upsf/mysize, cutoff_y=upsf/mysize, n=self.noiseFilterOrder, alpha=0, offset_x=2/(mysize-1),offset_y=2/(mysize-1))
                else:
                    filter = numpy.ones((int(mysize),int(mysize)))
                if lowsf>0:
                    filter = filter-filters.butter2d_lp_elliptic(size=[mysize,mysize], cutoff_x=lowsf/mysize, cutoff_y=lowsf/mysize, n=self.noiseFilterOrder, alpha=0, offset_x=2/(mysize-1),offset_y=2/(mysize-1))
                self.noiseTex = self.noiseTex*filter
            self.noiseTex = fftshift(self.noiseTex)
            self.noiseTex[0][0] = 0
        else:
            raise ValueError('Noise type not recognised.')
        self._needBuild = False # prevent noise from being re-built at next draw() unless a parameter is chnaged in the mean time.
        self.updateNoise()  # now choose the initial random sample.
Beispiel #4
0
    def buildNoise(self):
        """build a new noise sample. Required to act on changes to any noise parameters or texRes.
        """

        if self.units == 'pix':
            if not (self.noiseType in ['Binary','binary','Normal','normal','uniform','Uniform']):
                mysize = numpy.max(self.size)
            else:
                mysize = self.size
            sampleSize = self.noiseElementSize
            mysf = self.__dict__['noiseBaseSf']*mysize
            lowsf = self.noiseFilterLower*mysize
            upsf = self.noiseFilterUpper*mysize
        else:
            mysize = self.texRes
            pixSize = self.size/self.texRes
            sampleSize = self.noiseElementSize/pixSize
            mysf = self.size[0]*self.noiseBaseSf
            lowsf = self.size[0]*self.noiseFilterLower
            upsf = self.size[0]*self.noiseFilterUpper
       
        self._size = mysize  # store for use by updateNoise()
        self._sf = mysf
        if self.noiseType in ['binary','Binary','normal','Normal','uniform','Uniform']:
            self._sideLength = numpy.round(mysize/sampleSize)  # dummy side length for use when unpacking noise samples in updateNoise()
            self._sideLength.astype(int)
            if ((self._sideLength[0] < 2) and (self._sideLength[1] < 2)):
                msg=('Noise sample size '
                     'must result in more than '
                     '1 sample per image dimension.')
                raise ValueError(msg)
            totalSamples = self._sideLength[0]*self._sideLength[1]
            if self.noiseType in ['binary','Binary']:
                self.noiseTex=numpy.append(numpy.ones(int(numpy.round(totalSamples/2.0))),-1*numpy.ones(int(numpy.round(totalSamples/2.0))))
        elif self.noiseType in ['White','white']:
            self.noiseTex = numpy.ones((int(mysize),int(mysize)))
            self.noiseTex[0][0] = 0
        #elif self.noiseType in ['Coloured','coloured']:
        #    pin=filters.makeRadialMatrix(matrixSize=mysize, center=(0,0), radius=1.0)
        #    self.noiseTex=numpy.multiply(numpy.ones((int(mysize),int(mysize))),(pin)**self.noiseFractalPower) 
        #    self.noiseTex=fftshift(self.noiseTex)
        #    self.noiseTex[0][0]=0
        elif self.noiseType in ['Isotropic','isotropic']:
            if mysf > mysize/2:
                msg = ('Base frequency for isotropic '
                      'noise is definitely too high.')
                raise Warning(msg)
            localf = mysf/mysize
            linbw = 2**self.noiseBW
            lowf = 2.0*localf/(linbw+1.0)
            highf = linbw*lowf
            FWF = highf-lowf
            sigmaF = FWF/(2*numpy.sqrt(2*numpy.log(2)))
            self.noiseTex = numpy.zeros(int(mysize**2))
            self.noiseTex = numpy.reshape(self.noiseTex,(int(mysize),int(mysize)))
            pin = filters.makeRadialMatrix(matrixSize=mysize, center=(0,0), radius=2)
            self.noiseTex = filters.makeGauss(pin, mean=localf, sd=sigmaF)
            self.noiseTex = fftshift(self.noiseTex)
            self.noiseTex[0][0] = 0
        elif self.noiseType in ['Gabor','gabor']:
            if mysf > mysize/2:
                msg = ('Base frequency for Gabor '
                      'noise is definitely too high.')
                raise Warning(msg)
            localf = mysf/mysize
            linbw = 2**self.noiseBW
            lowf = 2.0*localf/(linbw+1.0)
            highf = linbw*lowf
            FWF = highf-lowf
            sigmaF = FWF/(2*numpy.sqrt(2*numpy.log(2)))
            FWO = 2.0*localf*numpy.tan(numpy.pi*self.noiseBWO/360.0)
            sigmaO = FWO/(2*numpy.sqrt(2*numpy.log(2)))
            self.noiseTex=numpy.zeros(int(mysize**2))
            self.noiseTex=numpy.reshape(self.noiseTex,(int(mysize),int(mysize)))
            yy, xx = numpy.mgrid[0:mysize, 0:mysize]
            xx = (0.5 - 1.0 / mysize * xx) 
            yy = (0.5 - 1.0 / mysize * yy) 
            self.noiseTex=filters.make2DGauss(xx,yy,mean=(localf,0), sd=(sigmaF,sigmaO))
            self.noiseTex=self.noiseTex+filters.make2DGauss(xx,yy, mean=(-localf,0), sd=(sigmaF,sigmaO))
            self.noiseTex=fftshift(self.noiseTex)
            self.noiseTex[0][0]=0
        elif self.noiseType in ['Image','image']:
            if not(self.noiseImage in ['None','none']):  
                im = Image.open(self.noiseImage)
                im = im.transpose(Image.FLIP_TOP_BOTTOM)
                im = im.convert("L")  # FORCE TO LUMINANCE
                intensity = numpy.array(im).astype(
                        numpy.float32) * 0.0078431372549019607 - 1.0
                self.noiseTex =  numpy.absolute(fft2(intensity))
            else:
                self.noiseTex = numpy.ones((int(mysize),int(mysize)))  # if image is 'None' will make white noise as tempary measure
            self.noiseTex[0][0]=0
        elif self.noiseType in ['filtered','Filtered']:
            pin=filters.makeRadialMatrix(matrixSize=mysize, center=(0,0), radius=1.0)
            self.noiseTex = numpy.multiply(numpy.ones((int(mysize),int(mysize))),(pin)**self.noiseFractalPower)
            if lowsf > mysize/2:
                msg = ('Lower cut off frequency for filtered '
                      'noise is definitely too high.')
                raise Warning(msg)
            if self.noiseFilterOrder > 0.01:
                if upsf<(mysize/2.0):
                    filter = filters.butter2d_lp_elliptic(size=[mysize,mysize], cutoff_x=upsf/mysize, cutoff_y=upsf/mysize, n=self.noiseFilterOrder, alpha=0, offset_x=2/(mysize-1),offset_y=2/(mysize-1))
                else:
                    filter = numpy.ones((int(mysize),int(mysize)))
                if lowsf>0:
                    filter = filter-filters.butter2d_lp_elliptic(size=[mysize,mysize], cutoff_x=lowsf/mysize, cutoff_y=lowsf/mysize, n=self.noiseFilterOrder, alpha=0, offset_x=2/(mysize-1),offset_y=2/(mysize-1))
                self.noiseTex = self.noiseTex*filter
            self.noiseTex = fftshift(self.noiseTex)
            self.noiseTex[0][0] = 0
        else:
            raise ValueError('Noise type not recognised.')
        self._needBuild = False # prevent noise from being re-built at next draw() unless a parameter is chnaged in the mean time.
        self.updateNoise()  # now choose the inital random sample.