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')
예제 #2
0
	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
        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