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
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)