def mark_holes(self): if self.__results['holes'] is None or self.__results['original'] is None: raise RuntimeError('need original image and holes before marking holes') image = self.__results['original'] im = image.copy() value = arraystats.min(im) for hole in self.__results['holes']: coord = hole.stats['center'] imagefun.mark_image(im, coord, value) self.__update_result('markedholes', im) if self.save_mrc: mrc.write(im, 'markedholes.mrc')
def solve(self, image, crop1, crop2, vectorguess, tolerance, radius, thickness): ## initial crop before vector search if crop1 is not None: print 'cropping image' image2 = image[crop1[0]:crop1[2], crop1[1]:crop1[3]] else: image2 = image print 'finding edges' t = timer.Timer('edge') edges2 = self.findEdges(image2) t.stop() save_mrc(edges2, 'edges.mrc') ## find the vectors based on guess and tolerance print 'finding vectors' vectors = self.findLatticeVectors(edges2, vectorguess, tolerance) print 'VECTOR0', vectors[0] print 'VECTOR1', vectors[1] ## second crop before center search if crop2 is not None: print 'cropping image' image3 = image2[crop2[0]:crop2[2], crop2[1]:crop2[3]] edges3 = edges2[crop2[0]:crop2[2], crop2[1]:crop2[3]] else: image3 = image2 edges3 = edges2 print 'creating template from vectors' # should calculate size of template more carefully temp = self.template(edges3.shape, vectors, radius, thickness) print 'finding center' center = self.correlateTemplate(edges3, temp) print 'CENTER', center ## find actual center based on prior cropping true_center = list(center) if crop1 is not None: center[0] += crop1[0] center[1] += crop1[1] if crop2 is not None: center[0] += crop2[0] center[1] += crop2[1] print 'clean up' # This is the brainless way to figure out the complete lattice. # It makes sure to cover the entire image. vectordist = apply(Numeric.hypot, vectors[0]) maxdist = apply(Numeric.hypot, image.shape) n = int(maxdist / vectordist) points = range(-n,n) good_lattice = self.latticePoints(vectors, points) final_points = [] for point in good_lattice: imagepoint = point[0] + true_center[0], point[1] + true_center[1] if imagepoint[0] >= 0 and imagepoint[0] < image.shape[0] and imagepoint[1] >= 0 and imagepoint[1] < image.shape[1]: final_points.append(imagepoint) imagefun.mark_image(image, imagepoint, 1500) save_mrc(image, 'marked.mrc') return final_points