示例#1
0
	def insertImage(self, input, target=None, outtext=None):
		if not self.needImage(input):
			return

		## differnce in binning requires scaling
		## assume equal x and y binning
		binscale = float(input.binx) / self.binx
		binmatrix = binscale * numpy.identity(2)

		## affine transform matrix is input matrix
		atmatrix = numpy.dot(binmatrix, input.trans.matrix)
		atmatrix = numpy.dot(self.outputmatrix, atmatrix)

		## affine_transform function requires the inverse matrix
		atmatrix = numpy.linalg.inv(atmatrix)

		## calculate offset position
		if target is None:
			instage = input.stage
		else:
			instage = input.trans.transform(target, input.stage, input.bin)

		pixels = self.trans.itransform(instage, self.stage, self.bin, True)
		shift = [pixels['row'],pixels['col']]
		offset = affine.affine_transform_offset(input.shape, self.shape, atmatrix, shift)

		if outtext:
			tile={}
			path = input.fileref.path
			fname = input.fileref.filename
			fullname = os.path.join(path, fname)
			args = tuple(atmatrix.flat) + tuple(shift)

			tile['fullname'] = fullname
			tile['name'] = fname
			tile['height'] = input.shape[0]
			tile['width'] = input.shape[1]
			tile['matrix'] = args
			
			return tile

		if target is None:
			## affine transform into temporary output
			output = numpy.zeros(self.shape, numpy.float32)

			inputarray = memmapMRC(input.fileref)

			#inputarray = splines.filter(input.fileref.filename, inputarray)
			scipy.ndimage.affine_transform(inputarray, atmatrix, offset=offset, output=output, output_shape=self.shape, mode='constant', cval=0.0, order=splineorder, prefilter=False)

			if self.image is None:
				self.image = numpy.zeros(self.shape, numpy.float32)

			## copy temporary into final
			numpy.putmask(self.image, output, output)
			self.inserted += 1
		else:
			pix = self.shape[0]/2.0+shift[0],self.shape[1]/2.0+shift[1]
			self.targets.append(pix)
    def correct_tilt(self, imagedata):
        '''
		takes imagedata and calculates a corrected image
		'''
        ## from imagedata
        im = imagedata['image']
        alpha = imagedata['scope']['stage position']['a']
        if abs(alpha) < self.alpha_threshold:
            return False
        beamtilt = imagedata['scope']['beam tilt']
        ht = imagedata['scope']['high tension']
        mag = imagedata['scope']['magnification']
        tem = imagedata['scope']['tem']
        cam = imagedata['camera']['ccdcamera']

        ## from DB
        tiltcenter = self.getRotationCenter(tem, ht, mag)
        # if no tilt center, then cannot do this
        if tiltcenter is None:
            self.node.logger.info(
                'not correcting tilted images, no rotation center found')
            return False
        tx = beamtilt['x'] - tiltcenter['x']
        ty = beamtilt['y'] - tiltcenter['y']
        bt = (tx, ty)
        if max(abs(bt[0]), abs(bt[1])) < self.bt_threshold:
            # don't transform if beam tilt is small enough
            return False

        alphadeg = alpha * 180 / 3.14159
        self.node.logger.info('correcting tilts, stage: %s deg beam: %s,%s' %
                              (alphadeg, tx, ty))

        defocusmatrix = self.getBeamTiltMatrix(tem, cam, ht, mag)
        stagematrix = self.getStageMatrix(tem, cam, ht, mag)

        mat = self.affine_transform_matrix(defocusmatrix, stagematrix, bt,
                                           alpha)
        scope = imagedata['scope']
        camera = imagedata['camera']
        ## calculate pixel shift to get to image shift 0,0
        imageshift = dict(scope['image shift'])
        #imageshift['x'] *= -1
        #imageshift['y'] *= -1
        pixelshift = self.itransform(imageshift, scope, camera)
        pixelshift = (pixelshift['row'], pixelshift['col'])
        offset = affine.affine_transform_offset(im.shape, im.shape, mat,
                                                pixelshift)
        mean = self.edge_mean(im)
        im2 = scipy.ndimage.affine_transform(im,
                                             mat,
                                             offset=offset,
                                             mode='constant',
                                             cval=mean)

        #im2 = self.filter.convolve(im2)
        imagedata['image'] = im2
        return True
	def correct_tilt(self, imagedata):
		'''
		takes imagedata and calculates a corrected image
		'''
		## from imagedata
		im = imagedata['image']
		alpha = imagedata['scope']['stage position']['a']
		if abs(alpha) < self.alpha_threshold:
			return False
		beamtilt = imagedata['scope']['beam tilt']
		ht = imagedata['scope']['high tension']
		mag = imagedata['scope']['magnification']
		tem = imagedata['scope']['tem']
		cam = imagedata['camera']['ccdcamera']
	
		## from DB
		tiltcenter = self.getRotationCenter(tem, ht, mag)
		# if no tilt center, then cannot do this
		if tiltcenter is None:
			self.node.logger.info('not correcting tilted images, no rotation center found')
			return False
		tx = beamtilt['x'] - tiltcenter['x']
		ty = beamtilt['y'] - tiltcenter['y']
		bt = (tx,ty)
		if max(abs(bt[0]),abs(bt[1])) < self.bt_threshold:
			# don't transform if beam tilt is small enough
			return False

		alphadeg = alpha * 180 / 3.14159
		self.node.logger.info('correcting tilts, stage: %s deg beam: %s,%s' % (alphadeg, tx, ty))

		defocusmatrix = self.getBeamTiltMatrix(tem, cam, ht, mag)
		stagematrix = self.getStageMatrix(tem, cam, ht, mag)

		mat = self.affine_transform_matrix(defocusmatrix, stagematrix, bt, alpha)
		scope = imagedata['scope']
		camera = imagedata['camera']
		## calculate pixel shift to get to image shift 0,0
		imageshift = dict(scope['image shift'])
		#imageshift['x'] *= -1
		#imageshift['y'] *= -1
		pixelshift = self.itransform(imageshift, scope, camera)
		pixelshift = (pixelshift['row'], pixelshift['col'])
		offset = affine.affine_transform_offset(im.shape, im.shape, mat, pixelshift)
		mean=self.edge_mean(im)
		im2 = scipy.ndimage.affine_transform(im, mat, offset=offset, mode='constant', cval=mean)

		#im2 = self.filter.convolve(im2)
		imagedata['image'] = im2
		return True
示例#4
0
    def correct_tilt(self, imagedata):
        """
		takes imagedata and calculates a corrected image
		"""
        ## from imagedata
        im = imagedata["image"]
        alpha = imagedata["scope"]["stage position"]["a"]
        if abs(alpha) < self.alpha_threshold:
            return False
        beamtilt = imagedata["scope"]["beam tilt"]
        ht = imagedata["scope"]["high tension"]
        mag = imagedata["scope"]["magnification"]
        tem = imagedata["scope"]["tem"]
        cam = imagedata["camera"]["ccdcamera"]

        ## from DB
        tiltcenter = self.getRotationCenter(tem, ht, mag)
        # if no tilt center, then cannot do this
        if tiltcenter is None:
            self.node.logger.info("not correcting tilted images, no rotation center found")
            return False
        tx = beamtilt["x"] - tiltcenter["x"]
        ty = beamtilt["y"] - tiltcenter["y"]
        bt = (tx, ty)
        if max(abs(bt[0]), abs(bt[1])) < self.bt_threshold:
            # don't transform if beam tilt is small enough
            return False

        alphadeg = alpha * 180 / 3.14159
        self.node.logger.info("correcting tilts, stage: %s deg beam: %s,%s" % (alphadeg, tx, ty))

        defocusmatrix = self.getBeamTiltMatrix(tem, cam, ht, mag)
        stagematrix = self.getStageMatrix(tem, cam, ht, mag)

        mat = self.affine_transform_matrix(defocusmatrix, stagematrix, bt, alpha)
        scope = imagedata["scope"]
        camera = imagedata["camera"]
        ## calculate pixel shift to get to image shift 0,0
        imageshift = dict(scope["image shift"])
        # imageshift['x'] *= -1
        # imageshift['y'] *= -1
        pixelshift = self.itransform(imageshift, scope, camera)
        pixelshift = (pixelshift["row"], pixelshift["col"])
        offset = affine.affine_transform_offset(im.shape, im.shape, mat, pixelshift)
        mean = self.edge_mean(im)
        im2 = scipy.ndimage.affine_transform(im, mat, offset=offset, mode="constant", cval=mean)

        # im2 = self.filter.convolve(im2)
        imagedata["image"] = im2
        return True
    def insertImage(self, input, target=None, outtext=None):
        if not self.needImage(input):
            return

        ## differnce in binning requires scaling
        ## assume equal x and y binning
        binscale = float(input.binx) / self.binx
        binmatrix = binscale * numpy.identity(2)

        ## affine transform matrix is input matrix
        atmatrix = numpy.dot(binmatrix, input.trans.matrix)
        atmatrix = numpy.dot(self.outputmatrix, atmatrix)

        ## affine_transform function requires the inverse matrix
        atmatrix = numpy.linalg.inv(atmatrix)

        ## calculate offset position
        if target is None:
            instage = input.stage
        else:
            instage = input.trans.transform(target, input.stage, input.bin)

        pixels = self.trans.itransform(instage, self.stage, self.bin, True)
        shift = [pixels['row'], pixels['col']]
        offset = affine.affine_transform_offset(input.shape, self.shape,
                                                atmatrix, shift)

        if outtext:
            tile = {}
            path = input.fileref.path
            fname = input.fileref.filename
            fullname = os.path.join(path, fname)
            args = tuple(atmatrix.flat) + tuple(shift)

            tile['fullname'] = fullname
            tile['name'] = fname
            tile['height'] = input.shape[0]
            tile['width'] = input.shape[1]
            tile['matrix'] = args

            return tile

        if target is None:
            ## affine transform into temporary output
            output = numpy.zeros(self.shape, numpy.float32)

            inputarray = memmapMRC(input.fileref)

            #inputarray = splines.filter(input.fileref.filename, inputarray)
            scipy.ndimage.affine_transform(inputarray,
                                           atmatrix,
                                           offset=offset,
                                           output=output,
                                           output_shape=self.shape,
                                           mode='constant',
                                           cval=0.0,
                                           order=splineorder,
                                           prefilter=False)

            if self.image is None:
                self.image = numpy.zeros(self.shape, numpy.float32)

            ## copy temporary into final
            numpy.putmask(self.image, output, output)
            self.inserted += 1
        else:
            pix = self.shape[0] / 2.0 + shift[0], self.shape[1] / 2.0 + shift[1]
            self.targets.append(pix)