Некоторые базовые операции предварительной обработки изображений для начинающих в Python

OpenCV для начинающих: перемещение или перевод, изменение размера и обрезка

Одной из наиболее часто используемых библиотек для обработки изображений и манипулирования ими является openCV для пользователей Python. Для классификации изображений, обнаружения объектов или оптического распознавания символов любая работа, связанная с изображениями в мире ИИ, большую часть времени требует какой-либо обработки изображений и манипуляций с ними. Решил написать несколько туториалов по OpenCV.

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

Прежде чем начать, это библиотеки, которые мы будем использовать сегодня.

import cv2
import matplotlib.pyplot as plt

Мы будем импортировать другие библиотеки по мере необходимости.

В этом уроке будет использоваться простое изображение смайлика. Пожалуйста, не стесняйтесь загружать изображение по этой ссылке:



В этой строке кода функция cv2.imread используется для чтения изображения и его сохранения в виде массива.

image = cv2.imread('smiley.jpg')

Если вы новичок в OpenCV, вот как выглядит переменная «image»:

 array([[[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       ...,

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]]], dtype=uint8)

Изображение можно показать с помощью функции .imshow(). Обе библиотеки Matplotlib и OpenCV имеют функции .imshow.

plt.imshow(image)

Перевести или переместить или сдвинуть

Мы начнем с того, как переместить или сдвинуть изображение. В этом уроке будет использоваться простое изображение смайлика.

Определите, как переместить изображение, и сохраните его в переменной перемещения. Сдвинем изображение на 100 пикселей вправо и на 30 пикселей вниз. Для этого переменная перемещения будет выглядеть так:

move = np.float32([[1, 0, 100], [0, 1, 30]])

Здесь 1 и 0 фиксированы. 100 в позиции [0, 2] переместит изображение вправо, а 30 в позиции [1, 2] переместит изображение вниз.

shift = cv2.warpAffine(image, move, (image.shape[1], image.shape[0]))
plt.imshow(shift)

Если вы хотите переместить изображение влево и вверх, вам просто нужно использовать отрицательные знаки:

move = np.float32([[1, 0, -100], [0, 1, -30]])
shift = cv2.warpAffine(image, move, (image.shape[1], image.shape[0]))
plt.imshow(shift)

То же самое можно сделать и с помощью библиотеки imutils. Вот синтаксис:

import imutils
moved = imutils.translate(image, -100, -30)

Он будет генерировать точно такое же изображение, как и последний. Как видите, использовать imutils немного проще.

Изменение размера

Операция изменения размера очень распространена при предварительной обработке изображений. Мы увеличиваем или уменьшаем высоту и ширину изображений в соответствии с нашими потребностями. Вот синтаксис изменения размера в OpenCV:

resized = cv2.resize(image, image_shape, interpolation = cv2.INTER_AREA)

Я использовал «интерполяцию» как cv2.INTER_AREA. Для этого есть и другие варианты. Мы поговорим о них позже. Начнем с image_shape. Важно позаботиться о соотношении сторон, чтобы изображение не выглядело искаженным. Для этого необходимо сохранить соотношение сторон выходного изображения как соотношение сторон входного изображения.

Если мы хотим, чтобы высота выходного изображения была 500, форма выходного изображения должна быть:

rsz = 500.0 / image.shape[1]
image_shape = (500, int(image.shape[0] * rsz))

Точно так же, если нам нужно, чтобы ширина выходного изображения была 300, мы вычисляем высоту выходного изображения.

rsz = 300.0 / image.shape[0]
image_shape = (int(image.shape[1] * rsz), 300)
resized = cv2.resize(image, image_shape, interpolation = cv2.INTER_AREA)

Это было все о форме изображения.

Третий параметр «интерполяция» имеет несколько различных опций. Вот имена:

cv2.INTER_LINEAR

cv2.INTER_NEAREST

cv2.INTER_CUBIC

cv2.INTER_LANCZOS4

Если вы не предоставляете какой-либо метод «интерполяции», OpenCV по умолчанию использует метод cv2.INTER_LINEAR, который обеспечивает билинейную интерполяцию.

Пожалуйста, не стесняйтесь исследовать больше, если вы заинтересованы.

Библиотека imutils значительно упрощает нам задачу. Он вычисляет соотношение сторон для нас. Это просто требует высоты или ширины. Он сам вычисляет ширину или высоту. Вот синтаксис:

im = imutils.resize(image, width=300)

Здесь мы предусмотрели, что ширина и высота будут рассчитываться автоматически, чтобы сохранить соотношение сторон неизменным.

Обрезка

Если вы когда-либо работали с изображениями, вы определенно выполняли обрезку каким-либо образом. Одним из распространенных способов обрезки изображения является простое разрезание массива. Как мы говорили в начале, изображение — это не что иное, как массив NumPy.

Здесь я обрезаю смайлик здесь:

part = image[0:600, 0:600]
plt.imshow(part)

Итак, он взял верхние 600 пикселей и 600 пикселей слева. Вот еще один пример:

part = image[100:600, 100:600]
plt.imshow(part)

На этот раз мы начинаем со 100-го пикселя сверху и слева. Итак, здесь мы взяли от 100-го пикселя до 599-го пикселя сверху, а также от 100-го пикселя до 599-го пикселя слева. Пожалуйста, не стесняйтесь попробовать и другой диапазон.

Заключение

В OpenCV доступно так много функций. Я просто хотел начать с этих трех основных операций. Будут гораздо более продвинутые методы, о которых я напишу в своих следующих уроках. Надеюсь, это было полезно.

Подробнее Чтение