Избавление от циклов for в Python с помощью Numpy - PullRequest
0 голосов
/ 26 мая 2020

Итак, у меня есть следующий код для изменения размера изображения с использованием интерполяции ближайшего соседа. Решение кажется мне простым, используя 2 цикла for, но я не могу придумать, как это сделать, используя numpy, чтобы избежать этих надоедливых циклов. Вот мой код:

def scale(img, factor):
    # Calculate new image shape and create new image with it.
    height, width = img.shape[:2]
    new_height, new_width = (int(height * factor), int(width * factor))[:2]
    scaled_img = np.zeros([new_height, new_width])

    # Iterate over all pixels and set their values based on the input image.
    for x in range(new_height):
        for y in range(new_width):
            scaled_img[x, y] = img[int(x / factor), int(y / factor)]

    return scaled_img

Любые данные о том, как избежать циклов for?

Ответы [ 3 ]

2 голосов
/ 26 мая 2020

Вы можете рассчитать сопоставление индексов нового изображения со старыми индексами, а затем использовать numpy .ix_ , чтобы объединить их

import numpy as np

def scale(img, factor):
    """
    >>> img = np.arange(9).reshape(3, 3)
    >>> print(img)
    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    >>> print(scale(img, 1.67))
    [[0 0 1 1 2]
     [0 0 1 1 2]
     [3 3 4 4 5]
     [3 3 4 4 5]
     [6 6 7 7 8]]
    """
    x_indices = (np.arange(int(img.shape[1] * factor)) / factor).astype(int) # [0 0 1 1 2]
    y_indices = (np.arange(int(img.shape[0] * factor)) / factor).astype(int)
    return img[np.ix_(y_indices, x_indices)]
2 голосов
/ 26 мая 2020

Я бы не писал этот код полностью и использовал библиотеку обработки изображений Pillow для изменения размера изображения. Не уверен в производительности, но я думаю, что они бы неплохо оптимизировали такие базовые c задачи.

0 голосов
/ 26 мая 2020

Хотя первый ответ действительно хорош с точки зрения «как мне это сделать с точки зрения numpy», я бы повторил ответ Нильса Л.: если вы хотите изменить размер изображения, тогда вы Вероятно, гораздо лучше использовать одну из библиотек обработки изображений.

Pillow работает хорошо, как и ndimage: http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.zoom.html#scipy .ndimage.zoom

Оба, вероятно, будут быть быстрее, чем numpy, а также предоставить вам гораздо больше возможностей в деталях того, как вы хотите, чтобы изменение размера работало, и позволить вам использовать различные методы интерполяции, если это то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...