Opencv изменить размер изображения python

Изменение размера изображения OpenCV cv2 в Python

Чтобы изменить размер изображения в Python, вы можете использовать функцию cv2.resize() библиотеки OpenCV cv2.

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

Как изменить размер изображения

Синтаксис

Ниже приводится синтаксис функции cv2.resize().

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
  • src – это исходное, исходное или входное изображение в виде массива numpy;
  • dsize – желаемый размер выходного изображения, заданный как кортеж;
  • fx – коэффициент масштабирования по оси X или по горизонтальной оси;
  • fy – коэффициент масштабирования по оси Y или вертикальной оси;
  • Интерполяция может быть одним из следующих значений:
    • INTER_NEAREST
    • INTER_LINEAR
    • ИНТЕР_ЗОНА
    • INTER_CUBIC
    • INTER_LANCZOS4
    • В зависимости от выбранной техники интерполяции используется соответствующий алгоритм. Вы можете рассматривать интерполяцию как метод, который решает, какой пиксель получает значение на основе соседних пикселей и масштаба, в котором изменяется размер изображения.

    Как изменить размер изображения?

    1. Сохраните соотношение сторон и увеличьте или уменьшите ширину и высоту изображения. Чтобы прояснить ситуацию, Aspect Ratio – это отношение ширины изображения к высоте.
    2. Масштабируйте изображение только по оси X или по горизонтали. То есть изменить ширину, сохраняя высоту такой же, как у исходного изображения.
    3. Масштабируйте изображение только по оси Y или вертикальной оси. То есть изменить высоту, сохраняя ширину такой же, как у исходного изображения.

    Рассмотрим следующее изображение. Мы будем использовать это изображение в качестве входного или исходного изображения в наших текущих программах-примерах.

    Изображение в качестве входного или исходного

    Пример 1

    В следующем примере мы увидим, как можно изменить размер изображения выше с помощью cv2.resize(), сохранив при этом соотношение сторон. Мы изменим размер изображения до 50% от его фактической формы, т.е. уменьшим его высоту до 50% от оригинала и ширину до 50% от оригинала.

    import cv2 src = cv2.imread('D:/cv2-resize-image-original.png', cv2.IMREAD_UNCHANGED) #percent by which the image is resized scale_percent = 50 #calculate the 50 percent of original dimensions width = int(src.shape[1] * scale_percent / 100) height = int(src.shape[0] * scale_percent / 100) # dsize dsize = (width, height) # resize image output = cv2.resize(src, dsize) cv2.imwrite('D:/cv2-resize-image-50.png',output)
    1. cv2.imread() считал указанный файл в cv2.IMREAD_UNCHANGED с каналом прозрачности (если есть) и вернул массив numpy со значениями пикселей.
    2. Для scale_percent установлено значение 50. Мы собираемся масштабировать изображение до 50% от его исходных размеров, как по ширине, так и по высоте.
    3. src.shape [1] дает ширину исходного изображения. int (src.shape [1] * scale_percent / 100) вычисляет 50% исходной ширины. Аналогичным образом рассчитывается и высота.
    4. Затем мы устанавливаем желаемый размер dsize с вновь вычисленными шириной и высотой.
    5. cv2.resize изменяет размер изображения src до размера dsize и возвращает массив numpy.
    6. Используя cv2.imwrite, мы записываем вывод cv2.resize в локальный файл изображения.

    Выходное изображение Python OpenCV cv2

    Пример 2

    В следующем примере мы будем масштабировать изображение только по оси x или по горизонтальной оси. И высоту изображения оставляем неизменной.

    В dsize мы сохраним высоту исходного изображения, но изменим ширину.

    import cv2 src = cv2.imread('D:/cv2-resize-image-original.png', cv2.IMREAD_UNCHANGED) # set a new width in pixels new_width = 300 # dsize dsize = (new_width, src.shape[0]) # resize image output = cv2.resize(src, dsize, interpolation = cv2.INTER_AREA) cv2.imwrite('D:/cv2-resize-image-width.png',output)

    Сохранение высоты исходного изображения

    Как изменить размер по вертикали?

    В следующем примере мы будем масштабировать изображение только по оси Y или Вертикальной оси. Ширина выходного изображения не отличается от ширины исходного изображения.

    В dsize мы сохраним ширину исходного изображения, но изменим высоту.

    import cv2 src = cv2.imread('D:/cv2-resize-image-original.png', cv2.IMREAD_UNCHANGED) # set a new height in pixels new_height = 200 # dsize dsize = (src.shape[1], new_height) # resize image output = cv2.resize(src, dsize, interpolation = cv2.INTER_AREA) cv2.imwrite('D:/cv2-resize-image-height.png',output)

    Сохранение ширины исходного изображения

    В этом руководстве на примерах Python мы узнали, как использовать функцию OpenCV cv2.resize(), чтобы изменять размер изображения по ширине, высоте или по обоим параметрам, сохраняя или не сохраняя соотношение сторон.

    Источник

    Изменение размера изображения в Python с помощью библиотеки OpenCV

    Обработка изображений — одна из наиболее часто выполняемых задач в цифровом мире. Поворот изображения, изменение размера и добавление различных фильтров — это частые операции, которые мы выполняем регулярно. Изменение размера изображения относится к масштабированию изображений. Вы можете увеличивать или уменьшать масштаб изображения. Масштабирование очень удобно в приложениях машинного обучения.

    В этом примере мы увидим, как изменить размер изображения в Python с помощью библиотеки OpenCV.

    Сначала мы импортируем модуль cv2, а затем используем метод cv2.resize() для изменения размера изображений в Python.

    Метод cv2.resize() в Python

    Чтобы изменить размер изображений в Python с помощью OpenCV, используйте метод cv2.resize(). OpenCV предоставляет нам ряд методов интерполяции для изменения размера изображения.

    Изменение изображения означает изменение его размеров. Размерами могут быть ширина, высота или и то, и другое. Кроме того, соотношение сторон исходного изображения может быть сохранено в изображении с измененным размером. Для изменения размера изображения OpenCV предоставляет функцию cv2.resize().

    Как изменить размер изображения в Python

    Метод интерполяции для изменения размера параметров

    1. cv2.INTER_AREA: этот параметр используется, когда нам нужно уменьшить изображение.
    2. cv2.INTER_CUBIC: этот вариант работает медленно, но более эффективно.
    3. cv2.INTER_LINEAR: этот параметр в основном используется, когда требуется масштабирование. Это метод интерполяции по умолчанию в OpenCV.

    Источник

    OpenCV — быстрый старт: базовые операции с изображениями

    Судя по количеству закладок на первой части, работа моя — не зряшная.
    В прошлый раз разбирали скучное открывание-закрывание картинки, в этот раз засунем в неё руки поглубже:

    • Доступ к пикселям и работа с ними.
    • Масштабирование картинки.
    • Обрезка.
    • Отражение.
    import cv2 import numpy as np import matplotlib.pyplot as plt from PIL import Image

    Первой картинкой пойдут уже знакомые шашечки:

    Доступ к отдельным пикселям

    Изображение в OpenCV — матрица numpy, а значит, для доступа к пикселю будем использовать нотацию матриц: [ r , c ]. Первое значение — строка, второе — колонка. Не забывайте о том, что индексация начинается с нуля!

    Для доступа к самому первому пикселю обратимся к элементу матрицы (изображения, то бишь) с индексами 0 и 0:

    # Читаем картинку как чб cb_img = cv2.imread("checkerboard_18x18.png",0) # Выводим массив, представляющий картинку print(cb_img) # Выводим значение самого первого пикселя (верх-лево) print(cb_img[0,0]) # Выводим значение первого пикселя слева от чёрной зоны print(cb_img[0,6])

    С доступом разобрались, поиграем со значениями.

    Изменение пикселей

    Просто переназначаем пиксель:

    Что-то похожее мы сделали в прошлый раз с каналами.

    Продублируем картинку, и накидаем в неё серых пикселей:

    cb_img_copy = cb_img.copy() # копируем загруженное изображение cb_img_copy[2,2] = 200 # пиксель в ячейке [2,2] будет равен 200 cb_img_copy[2,3] = 200 # и так далее cb_img_copy[3,2] = 200 cb_img_copy[3,3] = 200 # То же самое другими словами: # cb_img_copy[2:3,2:3] = 200 plt.imshow(cb_img_copy, cmap='gray') plt.show() print(cb_img_copy)

    Обрезка картинок

    Можно воспринимать кроп как задачу «из пачки пикселей берём только эти несколько».
    Загрузим новозеландскую лодку и потренируемся на ней:

    Opencv изменить размер изображения python

    img_NZ_bgr = cv2.imread("New_Zealand_Boat.jpg",cv2.IMREAD_COLOR) # или так: # img_NZ_bgr = cv2.imread("New_Zealand_Boat.jpg",1) # img_NZ_bgr = cv2.imread("New_Zealand_Boat.jpg") img_NZ_rgb = img_NZ_bgr[. -1] # или так: # img_NZ_rgb = cv2.cvtColor(img_NZ_bgr, cv2.COLOR_BGR2RGB) # или разбить на каналы и пересобрать в правильном порядке :) plt.imshow(img_NZ_rgb) plt.show()
    # кропнутый регион = область загруженной картинки # c 200 по 400 строку (или Y, если хотите) # и 300 по 600 колонку (или X, если хотите) cropped_region = img_NZ_rgb[200:400, 300:600] plt.imshow(cropped_region) plt.show()

    Масштабирование изображений

    Функция resize() отресайзит картинку в больший или меньший размер. А регулируется это всё аргументами src , dsize (обязательные), fx , fy (факультативные).

    cv2.resize() — синтаксис и аргументы

    dst = resize( src, dsize[, dst[, fx[, fy[, interpolation]]]] )

    dst — изображение на выходе. Размер картинки будет равен dsize (если он ненулевой), или посчитан через src.size() , fx , fy .
    Тип данных будет тем же, что и в оригинальной картинке.

    src — понятно, сама картинка, требующая вмешательства. Обязательный аргумент.
    dsize — необходимый размер, обязательный аргумент.
    fx — коэффициент масштаба горизонтальный.
    fy — коэффициент масштаба вертикальный.

    Чуть подробнее о том, что тут происходит

    В общем: в dsize кладётся кортеж с натуральными числами, две штуки: (500, 500). Это размер, в который картинка отмасштабируется.
    Можно воспользоваться вместо этого коэффициентами масштаба, тогда вместо dsize надо впечатать None .
    Коэффициенты масштаба — fx и fy — берут оригинальную картинку, и растягивают/стягивают её пропорционально.

    dsize — имеет приоритет: конструкция resize(src, dsize=(100, 100),fx=20, fy=20) выдаст картинку 100×100 пикселей.

    Первый вариант масштабирования: коэффициенты масштаба

    Увеличим кропнутую лодку в два раза:

    resized_cropped_region_2x = cv2.resize(cropped_region,None,fx=2, fy=2) plt.imshow(resized_cropped_region_2x) plt.show()

    Второй вариант масштабирования: сразу укажем нужные размеры

    desired_width = 100 # желаемая ширина desired_height = 200 # желаемая высота dim = (desired_width, desired_height) # размер в итоге # Масштабируем картинку resized_cropped_region = cv2.resize(cropped_region, dsize = dim, interpolation = cv2.INTER_AREA) # Или так: # resized_cropped_region = cv2.resize(cropped_region, # dsize = (100, 200), # interpolation = cv2.INTER_AREA) plt.imshow(resized_cropped_region) plt.show()

    Масштабирование с сохранением пропорций

    За основу возьмём вторую методу, но отталкиваться будем от желаемой ширины.
    Немного несложной математики:

    # Используем 'dsize' desired_width = 100 # желаемая ширина # соотношение сторон: ширина, делённая на ширину оригинала aspect_ratio = desired_width / cropped_region.shape[1] # желаемая высота: высота, умноженная на соотношение сторон desired_height = int(cropped_region.shape[0] * aspect_ratio) dim = (desired_width, desired_height) # итоговые размеры # Масштабируем картинку resized_cropped_region = cv2.resize(cropped_region, dsize=dim, interpolation=cv2.INTER_AREA) plt.imshow(resized_cropped_region) plt.show()

    Сохранимся-с!

    # Приводим картинку к RGB resized_cropped_region_2x = resized_cropped_region_2x[. -1] # Сохраняем картинку cv2.imwrite("resized_cropped_region_2x.png", resized_cropped_region_2x) # Посмотрим на сокранённую картинку (тут-то нам и пригодится подгруженный PIL) im = Image.open('resized_cropped_region_2x.png') im.show()

    Отражение картинки

    Происходит с помощью функции flip() .

    src — понятно, сама картинка, требующая вмешательства. Обязательный аргумент.
    flipCode — флаг, объясняющий функции, как конкретно мы хотим картинку отразить.

    img_NZ_rgb_flipped_horz = cv2.flip(img_NZ_rgb, 1) img_NZ_rgb_flipped_vert = cv2.flip(img_NZ_rgb, 0) img_NZ_rgb_flipped_both = cv2.flip(img_NZ_rgb, -1) plt.figure(figsize=[18,5]) plt.subplot(141);plt.imshow(img_NZ_rgb_flipped_horz);plt.title("Horizontal Flip"); plt.subplot(142);plt.imshow(img_NZ_rgb_flipped_vert);plt.title("Vertical Flip") plt.subplot(143);plt.imshow(img_NZ_rgb_flipped_both);plt.title("Both Flipped") plt.subplot(144);plt.imshow(img_NZ_rgb);plt.title("Original")

    Вот и всё! Второй маленький шажок к человеку-фотошопу пройден! До встречи в следующих сериях.

    Источник

    Читайте также:  Css background color width auto
Оцените статью