def _board_from_game_image(self, game_image):
        """Return a board object matching the board in the game image.
        Return None if any tiles are not identified.
        """
        # board image
        board_rect = self._board_tools['board_region'].region_in(game_image)
        t, l, b, r = board_rect
        board_image = game_image[t:b, l:r]
        # board grid and tiles --> fill in a Board object
        board = Board()
        grid = self._board_tools['grid']
        tile_id = self._board_tools['tile_id']
        for p, borders in grid.borders_by_grid_position(board_image):
            t, l, b, r = borders
            tile = board_image[t:b, l:r]
            tile_character = tile_id.identify(tile)
            if tile_character is None:
                return None  # soft failure
            board[p] = Tile.singleton(tile_character)
        return board
Return a board object matching the board in the game image.
        Return None if any tiles are not identified.