Поиск по сайту:

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


Поворот изображения — самая основная операция при редактировании изображений. Библиотека Python OpenCV предоставляет методы cv2.getRotationMatrix2D(),cv2.rotate() для очень простого выполнения этой задачи.

cv2.rotate() будет поворачивать изображение только на 0, 90, 180 или 270 градусов, тогда как Cv2.getRotationMatrix2D() будет поворачивать изображение на любой указанный угол. В статье ниже мы будем вращать изображение, не обрезая и не обрезая стороны, с помощью OpenCV Python.

Чтобы повернуть изображение с помощью метода cv2.getRotationMatrix2D(), нам нужно выполнить следующие три шага:

  • Сначала нам нужно получить центр вращения.

  • Далее, используя метод getRotationMatrix2D(), нам нужно создать матрицу двумерного вращения.

  • Наконец, используя функцию warpAffine() в OpenCV, нам нужно применить к изображению аффинное преобразование, чтобы исправить геометрические искажения или деформации изображения.

Использование функции Cv2.getRotationMatrix2D()

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

Синтаксис

cv2.getRotationMatrix2D(center, angle, scale)

Параметры

  • center: центр поворота входного изображения.

  • угол: угол поворота в градусах.

  • масштаб: изотропный масштабный коэффициент. Который масштабирует изображение вверх или вниз в соответствии с предоставленным значением.

Пример

Давайте возьмем пример и повернём изображение, используя тригонометрические функции математического модуля.

import cv2
import math

def rotate_image(array, angle):
   height, width = array.shape[:2]
   image_center = (width / 2, height / 2)
   
   rotation_mat = cv2.getRotationMatrix2D(image_center, angle, 1)
   
   radians = math.radians(angle)
   sin = math.sin(radians)
   cos = math.cos(radians)
   bound_w = int((height * abs(sin)) + (width * abs(cos)))
   bound_h = int((height * abs(cos)) + (width * abs(sin)))
   
   rotation_mat[0, 2] += ((bound_w / 2) - image_center[0])
   rotation_mat[1, 2] += ((bound_h / 2) - image_center[1])
   
   rotated_mat = cv2.warpAffine(array, rotation_mat, (bound_w, bound_h))
   return rotated_mat

img = cv2.imread('Images/car.jpg',1)
rotated_image = rotate_image(img, 256)

cv2.imshow('Rotated image', rotated_image)
cv2.waitKey(0) 
cv2.destroyAllWindows()

Введите изображение

Выход

Выходное повернутое изображение показано ниже.

Входное изображение успешно повернуто на угол 256 градусов.

Пример

В этом примере мы повернём изображение, используя cv2.getRotationMatrix2D() и встроенные в Python функции abs().

import cv2

def rotate_image(arr, angle):
   height, width = arr.shape[:2]
   # get the image centers
   image_center = (width/2, height/2)
   
   rotation_arr = cv2.getRotationMatrix2D(image_center, angle, 1)
   
   abs_cos = abs(rotation_arr[0,0])
   abs_sin = abs(rotation_arr[0,1])
   
   bound_w = int(height * abs_sin + width * abs_cos)
   bound_h = int(height * abs_cos + width * abs_sin)
   
   rotation_arr[0, 2] += bound_w/2 - image_center[0]
   rotation_arr[1, 2] += bound_h/2 - image_center[1]
   
   rotated_mat = cv2.warpAffine(arr, rotation_arr, (bound_w, bound_h))
   return rotated_arr

img = cv2.imread('Images/cat.jpg',1)
rotated_image = rotate_image(img, 197)

cv2.imshow('Original image', img)
cv2.imshow('Rotated image', rotated_image)
cv2.waitKey(0) 
cv2.destroyAllWindows()

Исходное изображение

Повернутое изображение

Входное изображение успешно повернуто на угол 197 градусов.

cv2.rotate()

Функция cv2.rotate() поворачивает кадр изображения на угол, кратный 90 градусам (0, 90, 180 или 270 углов). Функция поворачивает изображение тремя разными способами, используя параметры RotateCode= 0 или 1 или 2.

Синтаксис

cv2.cv.rotate( src, rotateCode[, dst] )

Параметры

  • src: входное изображение

  • RotateCode: указывает, как повернуть изображение.

  • dst: выходное изображение того же размера и глубины, что и входное изображение.

Возврат

Он возвращает повернутое изображение.

Пример

В этом примере входное изображение «Fruits.jpg» будет повернуто на 90 градусов против часовой стрелки.

import cv2
import numpy as np

img = cv2.imread('Images/logo.jpg',1)
rotated_image = cv2.rotate(img,rotateCode = 2)

cv2.imshow('Original image', img)
cv2.imshow('Rotated image', rotated_image)
cv2.waitKey(0) 
cv2.destroyAllWindows()

Исходное изображение

Повернутое изображение

Использование функции np.rot90()

Метод numpy.rot90() используется для поворота массива на 90 градусов. Если достаточно повернуть наш вход только примерно на 90 градусов, то это простой и легкий способ.

Пример

В этом примере мы возьмем входное прямоугольное изображение «car.jpg» размером 850X315.

import cv2
import numpy as np
img = cv2.imread('Images/car.jpg',1)
rotated_image = np.rot90(img)
cv2.imwrite('Rotated image.jpg', rotated_image)
cv2.imshow('InputImage', img)
cv2.waitKey(0)

Исходное изображение

Повернутое изображение

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

Статьи по данной тематике: