OpenCV, работа с изображением. Python

Сегодня мы продолжим изучать библиотеку 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, dim, 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)

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

Третий (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

Далее идет масштаб шрифта : у шрифта есть некий стандартный размер, который довольно таки большой. Этот параметр позволяет уменьшать или увеличивать шрифт относительно стандартного. Например, для увеличения в два раза — пишем 2, для уменьшения в 2 раза — 0.5.

Далее идет кортеж из трех чисел от 0 до 255, которые задают цвет в модели RGB. Нужно помнить, что в этом кортеже, цвета идут задом на перед: BGR. Синий цвет — (255,0,0).

Далее идут не обязательны параметры :

  • толщина пера — необязательный параметр;
  • тип линии — необязательный параметр, одно из трех значений: 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)