Numpy Изменяют размер/Повторно масштабируют Изображения

Я хотел бы взять изображение и изменить масштаб изображения, в то время как это - массив numpy.

Например, у меня есть это изображение бутылки кока-колы: бутылка 1

Который переводит в numpy массив формы (528, 203, 3) и я хочу изменить размер этого для высказывания размера этого второго изображения: бутылка 2

Который имеет форму (140, 54, 3).

Как я изменяю размер изображения к определенной форме, все еще поддерживая исходное изображение? Другие ответы предлагают разделить любую или третью строку, но что я хочу сделать, в основном уменьшить изображение, как Вы были бы с помощью редактора изображений, но в коде Python. Там какие-либо библиотеки должны сделать это в numpy/SciPy?

59
задан 6 January 2018 в 01:03

3 ответа

Для людей, происходящих здесь из Google, ища быстрый способ субдискретизировать изображения в numpy массивы для использования в приложениях Машинного обучения, вот супер быстрый метод (адаптирован от здесь ). Этот метод только работает, когда входные размеры являются кратными выходным размерам.

следующие примеры субдискретизируют от 128x128 до 64x64 (это может быть легко изменено).

Каналы, в последний раз заказывая

# large image is shape (128, 128, 3)
# small image is shape (64, 64, 3)
input_size = 128
output_size = 64
bin_size = input_size // output_size
small_image = large_image.reshape((output_size, bin_size, 
                                   output_size, bin_size, 3)).max(3).max(1)

Каналы, сначала заказывая

# large image is shape (3, 128, 128)
# small image is shape (3, 64, 64)
input_size = 128
output_size = 64
bin_size = input_size // output_size
small_image = large_image.reshape((3, output_size, bin_size, 
                                      output_size, bin_size)).max(4).max(2)

Для полутоновых изображений просто изменяются 3 на 1 как это:

Каналы, сначала заказывая

# large image is shape (1, 128, 128)
# small image is shape (1, 64, 64)
input_size = 128
output_size = 64
bin_size = input_size // output_size
small_image = large_image.reshape((1, output_size, bin_size,
                                      output_size, bin_size)).max(4).max(2)

Этот метод использует эквивалент макс. объединения. Это - самый быстрый способ сделать это, что я нашел.

7
ответ дан 1 November 2019 в 12:03
import cv2
import numpy as np

image_read = cv2.imread('filename.jpg',0) 
original_image = np.asarray(image_read)
width , height = 452,452
resize_image = np.zeros(shape=(width,height))

for W in range(width):
    for H in range(height):
        new_width = int( W * original_image.shape[0] / width )
        new_height = int( H * original_image.shape[1] / height )
        resize_image[W][H] = original_image[new_width][new_height]

print("Resized image size : " , resize_image.shape)

cv2.imshow(resize_image)
cv2.waitKey(0)
0
ответ дан 1 November 2019 в 12:03

там любые библиотеки, чтобы сделать это в Уверенном numpy/SciPy

. Можно сделать это без OpenCV, scikit-изображения или PIL.

изменение размеров Изображения в основном отображает координаты каждого пикселя от исходного изображения до его измененного положения.

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

Все, в чем Вы нуждаетесь, является функцией, которая делает эту интерполяцию для Вас. SciPy имеет interpolate.interp2d .

можно использовать его, чтобы изменить размер изображения в массиве numpy, сказать arr, следующим образом:

W, H = arr.shape[:2]
new_W, new_H = (600,300)
xrange = lambda x: np.linspace(0, 1, x)

f = interp2d(xrange(W), xrange(H), arr, kind="linear")
new_arr = f(xrange(new_W), xrange(new_H))

, Конечно, если Вашим изображением является RGB, необходимо выполнить интерполяцию для каждого канала.

, Если требуется понять больше, я предлагаю смотреть Изображения Изменения размеров - Компьютерофил .

0
ответ дан 1 November 2019 в 12:03

Другие вопросы по тегам:

Похожие вопросы: