Сегодня мы продолжим изучать библиотеку OpenCV. А точнее познакомимся с базовыми возможностями по работе с изображением. Что такое OpenCV как установить и т.д читаем тут.
Первым делом мы выведем картинку на экран :
import cv2 #Загружаем изображение image = cv2.imread("fice_11.jpg") #Отображение файла встроенными средствами OpenCV. cv2.imshow("Original image", image) # cv2.waitKey(0) # Ждем нажатия любой клавиши
Функция imread загружает изображение из указанного файла и возвращает его. Если изображение не может быть прочитано ( из-за отсутствия файла, неправильных разрешений, неподдерживаемого или недопустимого формата), функция возвращает пустую матрицу (Mat::data ==NULL ).
print(image.shape)
Посмотрев размер массива мы можем узнать разрешение картинки, например (1024, 1536, 3). Высота 1024, Ширина 1536, 3 канала цвета.
Давайте изменим размер картинки(resize image) :
# Считаем коэффициент соотношения сторон, что бы сохранить пропорции final_wide = int(input()) k = float(final_wide) / image.shape[1] new_size = (final_wide, int(image.shape[0] * k)) # уменьшаем изображение до подготовленных размеров resized = cv2.resize(image, new_size, interpolation=cv2.INTER_AREA) cv2.imshow("Resize image", resized) cv2.waitKey(0)
Первым делом мы почитали новый размер картинки и поместили его в переменную new_size. Далее с помощь метода cv2.resize () изменили размер картинки на новый. interpolation=cv2.INTER_AREA -алгоритм интерполяции :
- cv.INTER_NEAREST интерполяция ближайшего соседа .
- cv.INTER_LINEAR билинейная интерполяция.
- cv.INTER_CUBIC бикубическая интерполяция.
- cv.INTER_AREA пересчет с использованием отношения площадей пикселей. Это может быть предпочтительным методом для децимации изображения, так как он он дает результаты без муара. Но когда изображение масштабируется, это похоже на метод INTER_NEAREST.
- cv.INTER_LANCZOS4 Интерполяция Lanczos по окрестности 8×8 .
Теперь сохраним полученное изображение в новый файл :
# запишем изображение на диск в формате png cv2.imwrite("resize.png", resized)
Переворот (flip) :
#отразим изображение по горизонтали flip_image = cv2.flip(resized, 1) cv2.imshow("Flip image", flip_image) cv2.waitKey(0)
cv2.flip () Переворачивает 2D массив вокруг вертикальной, горизонтальной или обеих осей.
- 1 — означает переворот вокруг оси y .
- 0 — означает переворот вокруг оси x .
- -1 — означает переворот по обоим осям .

Кадрирование :
Загружаем фото в виде массива Numpy. Поэтому нам ничего не мешает взять любой кусок массива и сохранить в новый файл и т.д. Для этого можно легко воспользоваться срезами:
# вырежем участок изображения используя срезы cropped = image[0:700, 300:1200] cv2.imshow("Cropped image", cropped) cv2.waitKey(0)

Размытие по Гауссу ( Gaussian blur) :
# Размытие по гауссу gaus = cv2.GaussianBlur(image, (9, 9), 10) cv2.imshow("Gaussian blur", gaus) cv2.waitKey(0)

cv2.GaussianBlur() — Первый параметр массив картинки, далее (9, 9) так называемый размер ядра фильтра, чем больше значение тем больше размытие(значения должны быть не четными) . Далее идет стандартное отклонение по оси X .
Наложение текста и графики на картинку :
color_yellow = (0,255,255) text = cv2.putText(resized, "Yooohhoo!", (100,50), cv2.FONT_HERSHEY_SIMPLEX, 1, color_yellow, 2) cv2.imshow("Text", text) cv2.waitKey(0)

Мы наложили текс, а теперь по по порядку. Первый параметр понятен, массив картинки (resized). Второй тоже очевиден, текст («Yooohhoo!»).
Третий (100, 50) кортеж из двух координат нижнего левого угла текста.
Далее идет тип шрифта :
- FONT_HERSHEY_SIMPLEX
- FONT_HERSHEY_PLAIN
- FONT_HERSHEY_DUPLEX
- FONT_HERSHEY_COMPLEX
- FONT_HERSHEY_TRIPLEX
- FONT_HERSHEY_COMPLEX_SMALL
- FONT_HERSHEY_SCRIPT_SIMPLEX
- FONT_HERSHEY_SCRIPT_COMPLEX
Далее идет масштаб шрифта (1) : у шрифта есть некий стандартный размер, который довольно таки большой. Этот параметр позволяет уменьшать или увеличивать шрифт относительно стандартного. Например, для увеличения в два раза — пишем 2, для уменьшения в 2 раза — 0.5.
Далее идет кортеж из трех чисел от 0 до 255 (color_yellow), которые задают цвет в модели RGB. Нужно помнить, что в этом кортеже, цвета идут задом на перед: BGR. Синий цвет — (255,0,0).
Далее идут не обязательны параметры :
- толщина пера (2) — необязательный параметр;
- тип линии — необязательный параметр, одно из трех значений: LINE_8 пунктир мелкий, LINE_4 — пунктир крупный, LINE_AA — сглаженная линия;
- центр координат — необязательный параметр. По-умолчанию координаты текста отсчитываются от верхнего левого угла. Если этот параметр равен True, то будут от нижнего левого угол.
Чертим линии :
line( кадр, координаты начала, координаты конца, цвет [, толщина пера [, тип линии [, сдвиг]]])
Помимо известных уже аргументов есть и один новый:
- сдвиг — необязательный параметр. Отвечает за смещение координат по формуле x = x*2^-сдвиг. Применяется для создания сглаженных линий.
Переходим к прямоугольнику:
rectangle( кадр, координаты 1, координаты 2, цвет [, толщина пера [, тип линии [, сдвиг]]])
Здесь:
- координаты 1 — координаты верхнего левого угла;
- координаты 2 — координаты нижнего правого угла.
color_red = (0, 0, 255) line = cv2.line(resized, (180, 85), (370, 85), color_red, thickness=2, lineType=8, shift=0) line = cv2.rectangle(line, (180, 140), (370, 180), color_red, thickness=2, lineType=8, shift=0) cv2.imshow("Line", line) cv2.waitKey(0)
