def split_to_tiles(img, columns, rows):
    """
    Split an image into a specified number of tiles.
    Args:
       img (ndarray):  The image to split.
       number_tiles (int):  The number of tiles required.
    Returns:
        Tuple of tiles
    """
    # validate_image(img, number_tiles)

    im_w, im_h = img.shape
    # columns, rows = calc_columns_rows(number_tiles)
    # extras = (columns * rows) - number_tiles
    tile_w, tile_h = int(np.floor(im_w / columns)), int(np.floor(im_h / rows))

    tiles = []
    # number = 1
    for pos_y in range(0, im_h - rows, tile_h):  # -rows for rounding error.
        for pos_x in range(0, im_w - columns, tile_w):  # as above.
            roi = (pos_x, pos_y, pos_x + tile_w, pos_y + tile_h)
            # image = img.crop(area)
            tile = img[roi[1]:roi[3], roi[0]:roi[2]]
            # position = (int(floor(pos_x / tile_w)) + 1,
            #             int(floor(pos_y / tile_h)) + 1)
            # coords = (pos_x, pos_y)
            # tile = Tile(image, number, position, coords)
            tiles.append(tile)
            # number += 1

    return tuple(tiles)