Как перевернуть картинку в python
Перейти к содержимому

Как перевернуть картинку в python

  • автор:

Rotating Image By Any Angle(Shear Transformation) Using Only NumPy

T hese days, we are spoiled with high end libraries. When It comes to Image Processing and advanced libraries such as OpenCV Rotating Image may sound like a very easy task using inbuilt functions.I am not telling you to code everything from scratch, However, an understanding about how things work will make you a better programmer. So let’s get started.

BITMAPS

A typical computer image these days uses 24 bits to represent the color of each pixel. Eight bits are used to store the intensity of the red part of a pixel (00000000 through 11111111), giving 256 distinct values. Eight bits are used to store the green component, and eight bits are used to store the blue component.

Each pixel has a coordinate pair (x,y) describing its position on two orthogonal axes from defined origin O.It is around this origin we are going to rotate this image.What we need to do is take the RGB values at every (x,y) location, rotate it as needed, and then write these values in the new location, considering (x,y) with respect to the origin we assumed.The new location is obtained by using the transformation matrix.

When image will be rotated ,the dimension of the frame containing it will change so to find the new dimensions we use this formula,

now let’s code it

ALIASING

So our resultant image is rotated by 15 degrees ,so it really worked,but what are those black dots?This is a problem called aliasing.Multiplying by sines and cosines on the integer coordinates of the source image gives real number results, and these have to be rounded back to integers again to be plotted. Sometimes this number rounding means the same destination location is addressed more than once, and sometimes certain pixels are missed completely. When the pixels are missed, the background shows through. This is why there are holes.The aliasing problem gets worse when angles are closesr to the diagonals. Here are a few examples of images at different rotations:

What can we do about this? There are a variety of solutions. One of them is to oversample the source image. We can pretend that each of the original source pixels is really a grid of n x n smaller pixels (all of the same color), and calculate the destination coordinates of each of these subpixels and plot these

A more refined way is called Area Mapping. For this, you invert the problem, and for each destination pixel, you find which four partial source pixels that it was created from. The color for the destination is calculated by the area-weighted average of the four source pixels (The source pixels that contribute more to the destination pixel have a greater influence on its color). This algorithm not only ensures that there are no gaps in the destination, but also appropriately averages the colors (ensuring both a smoother image and also keeping the average brightness of the rotated image constant).

However, there is a more elegant method, and this is the method that was used many years ago when computing power (and memory) were at a premium and every processor cycle worth its weight in gold. It is called the three shear rotation method.

THREE SHEARS

These method works by expanding 2D rotation matrix into three different matrices.

There are some interesting properties of this matrix:-

  1. The three matrices are all shear matrices
  2. The first and the last matrices are the same
  3. The determinant of each matrix is same (each stage is conformal and keeps the area the same).
  4. As the shear happens in just one plane at time, and each stage is conformal in area, no aliasing gaps appear in any stage.

note: Shear matrix shown above rotates in clockwise direction so we need to take angle in negative values to assess for that.

So let’s code the shear transformation

In the first shear operation, raster columns are simply shifted up and down relative to each other. The shearing is symmetric around the center of the image. It’s analogous to shearing a deck of playing cards.

The second shear operation does a similar thing on the previous image, but this time does the shearing left to right.

The final shear is the same as the first operation; this time applied to the intermediate image.

No gaps! How elegant is that? We just rotated an image an arbitrary amount (smoothly) using three shear operations!

In times-past, when floating point and trig calculations were expensive, these properties were very important. Because only one plane was being modified at once, no additional memory was needed as the code could simple walk down the raster line making the changes it needed. Pretty cool ��.

Поворот и отображение изображения на 45, 90, 180, 270 градусов в Python

Чтобы повернуть изображение на угол с помощью Pillow, вы можете использовать метод rotate() для объекта Image, который вращает изображение против часовой стрелки.

Синтаксис

Синтаксис метода rotate() показан в следующем блоке кода.

  • angle – в градусах против часовой стрелки;
  • resample – необязательный фильтр передискретизации. Это может быть один из PIL.Image.NEAREST (использовать ближайшего соседа), PIL.Image.BILINEAR (линейная интерполяция в среде 2 × -2) или PIL.Image.BICUBIC (интерполяция кубическим сплайном в среде 4 × 4). Если опущено или если изображение имеет режим «1» или «P», устанавливается значение PIL.Image.NEAREST;
  • expand – необязательное расширение. Если задано значение true, выходное изображение расширяется до размера, достаточного для размещения всего повернутого изображения. Если false или опущено, сделайте выходное изображение того же размера, что и входное изображение. Обратите внимание, что flag расширения предполагает вращение вокруг центра и отсутствие смещения;
  • center – необязательный центр вращения (кортеж из двух элементов). Начало координат – левый верхний угол. По умолчанию это центр изображения;
  • translate – необязательный перевод после поворота (двухкортежный);
  • fillcolor – необязательный цвет для области за пределами повернутого изображения.

Пример 1: повернуть изображение на 45 градусов

В следующем примере мы повернем изображение на 45 градусов против часовой стрелки.

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

Поворот изображения на 45 градусов

Размер исходного изображения сохраняется. Вы можете настроить размер выходного изображения в соответствии с поворотом.

Пример 2

В следующем примере мы настроим размер выходного изображения в соответствии с поворотом, используя параметр expand = True.

Настройка размера выходного изображения

Пример 3: поворот на 90 градусов

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

Поворот изображени на 90 градусов

Пример 4: поворот на 180 градусов

В этом примере Python Pillow мы повернем изображение на 180 градусов.

Поворот на 180 градусов

Отображение изображения

Чтобы показать или отобразить изображение в Pillow, вы можете использовать метод show() для объекта изображения.

Метод show() записывает изображение во временный файл, а затем запускает программу по умолчанию для отображения этого изображения. По завершении выполнения программы временный файл будет удален.

Пример 1

В следующем примере мы прочитаем изображение и покажем его пользователю в графическом интерфейсе с помощью метода show().

Отображение изображения с помощью графической программы по умолчанию

В этом скрипте мы используем ПК с Windows, а программа «Фото» по умолчанию используется для открытия изображений BMP. Следовательно, метод show() отображал изображение с помощью программы Photos.

Пример 2

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

В следующем примере мы прочитаем несколько изображений и покажем их пользователю в графическом интерфейсе с помощью метода show().

Как повернуть изображение используя Pillow

Поворачиваем изображение в PIL Python

Метод rotate() из модуля Image применяется для поворачивания изображения в зависимости от указанных градусов.

Содержание статьи

Загружаем и сохраняем картинку: guido-van-rossum.jpg

Данный код выведет наше изображение.

Как повернуть изображение используя Pillow

Угол вращения картинки в Pillow

В методе rotate() указываем угол вращения изображения в градусах в качестве первого аргумента. Направление вращения будет против часовой стрелки.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Поворачиваем изображение на 90 градусов:

Полученный результат с повернутой картинкой на 90 градусов против часовой стрелки:

Повернуть картинку на 90 градусов

Поворачиваем изображение на 45 градусов через PIL в Python:

Поворачиваем изображение на 45 градусов

Поворачиваем изображение полностью

Как видно на картинках в примерах выше, по умолчанию размер готового изображения равен размеру изначального изображения, а части повернутого изображения которые попали за пределами изначального размера отсекаются. Если мы поставим параметр expand на True , то повернутое изображение удовлетворит наши требования.

Теперь изображение выглядит так как мы ожидали. Она повернулась полностью, без черных границ по сторонам.

Поворачиваем изображение на 90 градусов

Поворачиваем изображение на 45 градусов.

Поворачиваем изображение на 45 градусов в Python

Фильтры NEAREST, BILINEAR и BICUBIC в Pillow

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

  • Image.NEAREST (ближайший сосед / по умолчанию);
  • Image.BILINEAR ;
  • Image.BICUBIC .

С помощью фильтра Image.BICUBIC детали изображения станут более четким, чем в случае использования фильтра по умолчанию Image.NEAREST .

Image.NEAREST Image.BILINEAR Image.BICUBIC
Pillow Image.NEAREST Python PIL Image.BILINEAR Python Pillow Image.BICUBIC Python

Небольшие различия есть, но у данной картинки они не очень видны. Но, например фильтр Image.BILINEAR сделал картинку более гладкой.

Меняем центр изображения при её поворачивании

Вы можете уточнить позицию центра изображения с помощью параметра center в методе rotate() .

Как повернуть изображение в Python?

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

Как повернуть изображение в Python?

При работе с изображениями довольно часто возникает необходимость повернуть картинку. Рассмотрим варианты поворота изображений на произвольный угол при помощи библиотек Pillow и OpenCV. Предложенный в Pillow метод очень прост, он позволяет осуществить поворот изображения на заданный угол вокруг центральной точки. В OpenCV повернуть изображение «без заморочек» можно только на 90, 180 или 270 градусов. Поворот на любой другой угол в OpеnCV реализован немного сложнее, однако он позволяет самостоятельно выбрать центр поворота, а также поиграться с масштабом картинки и другими настройками. Рассмотрим на примерах, как можно повернуть изображение в Python в обозначенных питоновских библиотеках:

    (если нужно «просто повернуть картинку без лишних заморочек», это подходящий вариант �� )
  • Как повернуть изображение в Python с помощью библиотеки OpenCV?(OpenCV — серьезная графическая библиотека, подход к повороту изображений это подтверждает)

ПОВОРАЧИВАЕМ ИЗОБРАЖЕНИЕ С ПОМОЩЬЮ БИБЛИОТЕКИ PILLOW!

Немного теории

Метод поворота в библиотеке Pillow имеет следующий формат:

rotate ( angle [, expand=False] )

Параметры:

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

2. expand(в переводе с англ. значит «расширение») — это необязательный параметр, по умолчанию принимающий значение False. Зачем нужен этот параметр? Как вы увидите на примере ниже, размеры повернутого изображения могут превышать размеры исходной картинки. В случае, когда параметр expand=False, «лишние» края повернутого изображения обрезаются так, чтобы размеры исходного и повернутого изображения были равны. В противном случае, когда expand=True, размер повернутого изображения увеличивается до размеров, необходимых для отображения полученной картинки целиком.

Примеры поворота изображения с помощью метода rotate() библиотеки Pillow

Дано изображение города размером 550X330px. Нужно повернуть изображение на 30 градусов против часовой стрелки, сохранив исходный размер 550X330px.

Важно: для корректной работы кода, исходное изображение ‘city.jpg’ должно лежать в той же директории, в которой расположен файл с кодом!

В результате мы видим на экране изображение размером 550x330px, полученное путём поворота исходного изображения на 30 градусов против часовой стрелки. При этом области полученного после поворота изображения, которые «вышли» за границы 550x330px, были подрезаны. Чтобы получить изображение целиком, без обрезанных краев, нужно расширить размер повернутого изображения. Как это сделать, смотрите в примере №2.

Дано изображение города размером 550x330px. Нужно повернуть изображение на 30 градусов против часовой стрелки так, чтобы повернутое изображение было сохранено целиком, без подгонки до исходного размера.

Важно: для корректной работы кода, исходное изображение ‘city.jpg’ должно лежать в той же директории, в которой расположен файл с кодом!

Так как мы передали методу rotate параметр expand=True, то полученное после поворота изображение выводится на экран в полном размере. Если размер исходного изображения был 550x330px, то размер повернутого изображения увеличился до 642×562рх:

повернуть изображение в Python

Фото, повернутое на 30 градусов против часовой стрелки

У нас появился Telegram-канал для изучающих Python! Канал совсем свежий, подпишись одним из первых, ведь вместе «питонить» веселее! �� Ссылка на канал: «Кодим на Python!»

ПОВОРАЧИВАЕМ ИЗОБРАЖЕНИЕ С ПОМОЩЬЮ БИБЛИОТЕКИ OPENCV

    — простой в реализации способ, но позволяет повернуть картинку только на 90, 180 или 270 градусов
    — этот метод сложнее предыдущего, но позволяет поворачивать изображения на любой угол
Поворот изображения на угол, кратный 90 градусам

Начиная с версии 3.2, в OpenCV мы можем повернуть изображение на 90, 180 или 270 градусов посредством одной лишь функции под названием rotate():

cv2.rotate (img, rotateCode [, dst] )

Параметры:

  • img — изображение, которое нужно повернуть
  • rotateCode — содержит «код поворота», который может принимать значения:
    • cv2.ROTATE_90_CLOCKWISE — для поворота на 90 градусов по часовой стрелке
    • cv2.ROTATE_180 — для поворота на 180 градусов
    • cv2.ROTATE_90_COUNTERCLOCKWISE — для поворота на 90 градусов против часовой стрелки, что равно повороту на 270 градусов по часовой стрелке
    • dst(необязательный параметр) — выходное изображение
    Пример поворота изображения на 90 градусов с помощью метода rotate() библиотеки OpenCV

    Повернем изображение с Эверестом на 90 градусов по часовой стрелке и сохраним полученный файл.

    Важно: для корректной работы кода, исходное изображение ‘Everest.jpg’ должно лежать в той же директории, в которой расположен файл с кодом!

    В результате работы кода получим новый файл ‘Everest_90.jpg’ следующего вида:

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

    А теперь не просто сохраним файл, но и выведем его на экран прямо в листинге с кодом!

    В этом случае нам понадобится подключить библиотеку matplotlib. Она нужна для вывода изображения на экран. Кроме того, так как OpenCV по умолчанию открывает изображения в BGR-формате, а matlotlib использует RGB, то при выводе изображения на экран, изменим его цветовой режим c помощью функции cv2.cvtColor():

    Важно: для корректной работы кода, исходное изображение ‘Everest.jpg’ должно лежать в той же директории, в которой расположен файл с кодом!

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

    КАК ПОВЕРНУТЬ ИЗОБРАЖЕНИЕ В OPENCV НА ПРОИЗВОЛЬНЫЙ УГОЛ?

    Поворот изображений на угол, не кратный 90, в OpenCV реализуется немного сложнее. Однако, при этом способе поворота вы можете самостоятельно определить центр, вокруг которого будет вращаться картинка, указать масштаб повернутого изображения, а также поиграться с другими настройками.

    Как работает поворот изображения в OpenCV?

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

    Если мы захотим повернуть картинку вокруг нецентральной точки, матрица поворота примет более сложный вид. Но мы не будем подробно на этом останавливаться — к счастью, в OpenCV существует функция getRotationMatrix2D(), которая создаст матрицу поворота за нас. После этого нужно вызвать функцию warpAffine(), которая осуществит афинное преобразование картинки на основе переданной в качестве параметра матрицы поворота. В результате афинного преобразования мы получим повернутое на заданный угол изображение.

    Форматы функций getRotationMatrix2D и warpAffine:

    cv2.getRotationMatrix2D ( (centre_x, centre_y), angle, scale )

    Параметры:

    (center_x, center_y) — координаты точки, вокруг которой будет поворачиваться изображение

    angle — угол поворота, заданный в градусах. При определении угла следует помнить, что изображение в OpenCV поворачивается против часовой стрелки!

    scale — масштаб для изменения повернутого изображения. Если scale = 0.5, то при повороте изображение уменьшится в 2 раза.

    cv2.warpAffine ( src, M, dsize [, dst] [, flags] [, borderMode] [, borderValue] )

    Параметры:

    src — изображение, которое нужно повернуть

    M — матрица поворота, которую можно получить с помощью функции getRotationMatrix2D

    dsize — размер выходного изображениям

    dst — (не обязательный параметр) выходное изображение

    flags — (не обязательный параметр) комбинация методов интерполяции

    borderMode(не обязательный параметр) метод экстраполяции пикселей

    borderValue — (не обязательный параметр) значение, используемое в случае постоянной границы

    Пример поворота изображения в OpenCV на 30 градусов по часовой стрелке(330 — против часовой):

    В результате в директории с кодом появился новый файл под названием «Everest_30.jpg»:

    Как видно, размер полученного изображения равен размеру исходного, поэтому «лишние» края повернутого изображения обрезаны. Чтобы этого избежать, нужно изменить координаты точки, вокруг которой будет вращаться изображение (center_x и center_y), а также увеличить размер выходного изображения в функции cv2.warpAffine():

    Мы рассмотрели варианты поворота изображения с помощью двух питоновских библиотек Pillow и OpenCV. В тех случаях, когда требуется «просто повернуть картинку без лишних заморочек» и нет необходимости в использовании OpenCV, я рекомендую воспользоваться функцией rotate() библиотеки Pillow. Если же у вас более серьезный графический проект, предполагающий специфические модификации и работу с OpenCV, то выбор в пользу OpenCV очевиден!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *