def run_paikin_tal_driver(img_files, puzzle_type, piece_width): """ Runs the Paikin and Tal image solver. Args: img_files ([str]): An array of one or more image file path(s). puzzle_type (Optional PuzzleType): Type of the puzzle to solve piece_width (Optional int): Width of a puzzle piece in pixels. """ image_filenames = config.add_image_folder_path(img_files) # Print the names of the images being solved: logging.info("Standard Paikin & Tal Driver") puzzle_importer.log_puzzle_filenames(image_filenames) # When skipping placement, simply import the solved results. if SKIP_PLACEMENT: paikin_tal_solver = PaikinTalSolver.pickle_import_after_standard_run_placement(image_filenames, puzzle_type) else: paikin_tal_solver = run_paikin_tal_solver(image_filenames, puzzle_type, piece_width) # Get the results paikin_tal_solver.segment(color_segments=True, perform_segment_cleaning=True) (pieces_partitioned_by_puzzle_id, _) = paikin_tal_solver.get_solved_puzzles() timestamp = time.time() Puzzle.output_results_information_and_puzzles( PuzzleSolver.PaikinTal, image_filenames, paikin_tal_solver, pieces_partitioned_by_puzzle_id, timestamp )
def run_multipuzzle_solver_driver(image_files, puzzle_type, piece_width): """ Runs the multipuzzle solver on a set of images. Args: image_files (List[str]): List of puzzle file paths. puzzle_type (PuzzleType): Type of the puzzle to solve. piece_width (int): Puzzle piece width in number of pixels """ image_filenames = config.add_image_folder_path(image_files) logging.info("Starting Multipuzzle Solver Driver.") puzzle_importer.log_puzzle_filenames(image_filenames) multipuzzle_solver = build_multipuzzle_solver(image_filenames, puzzle_type, piece_width) # Run the solver multipuzzle_solver.run()
def _build_similarity_matrix(self): """ Creates the asymmetric overlap and segment similarity matrices for use in the hierarchical clustering. """ logging.info("Reminder on the image files:") puzzle_importer.log_puzzle_filenames(self._image_filenames) # Build the similarity matrix. Worst similarity is 0 numb_segments = len(self._segments) self._asymmetric_overlap_matrix = np.full((numb_segments, numb_segments), fill_value=-1, dtype=np.float) # Calculate asymmetric overlap for each segment numb_pieces_in_each_segment = [segment.numb_pieces for segment in self._segments] for segment_i in xrange(0, numb_segments): # Iterate through all the stitching pieces in this segment and calculate the asymmetric overlap for stitching_piece_info in self._stitching_pieces[segment_i]: overlap = stitching_piece_info.calculate_overlap_coefficient(numb_pieces_in_each_segment) # Get the max overlap between pairs of segments for segment_j in xrange(0, numb_segments): if segment_i == segment_j: continue # Update if the new value is greater if self._asymmetric_overlap_matrix[segment_i, segment_j] < overlap[segment_j]: self._asymmetric_overlap_matrix[segment_i, segment_j] = overlap[segment_j] MultiPuzzleSolver._log_numpy_matrix("Asymmetric Segment Overlap Matrix:", self._asymmetric_overlap_matrix) # Calculate the similarity matrix self._segment_similarity_matrix = np.full((numb_segments, numb_segments), fill_value=-1, dtype=np.float) for segment_i in xrange(0, numb_segments): for segment_j in xrange(segment_i + 1, numb_segments): similarity = self._asymmetric_overlap_matrix[segment_i, segment_j] \ + self._asymmetric_overlap_matrix[segment_j, segment_i] similarity /= 2 self._segment_similarity_matrix[segment_i, segment_j] = similarity MultiPuzzleSolver._log_numpy_matrix("Segment Similarity Matrix", self._segment_similarity_matrix) if MultiPuzzleSolver._ALLOW_POST_SIMILARITY_MATRIX_CALCULATION_PICKLE_EXPORT: self._pickle_export_after_similarity_matrix_calculation()