Статьи

Почему изображения моего мобильного телефона вращаются на рабочем столе?

Однажды мой друг прислал мне несколько изображений, чтобы проверить мой алгоритм. Алгоритм работал просто отлично, и у меня все прошло. Однако, анализируя результаты, я увидел, что некоторые изображения были повернуты!

Я действительно не мог понять причину. Ничто в моем алгоритме не выполняло никаких вращений, и это было немного странно. К счастью, я понял причину, по которой это все-таки произошло, и в этом посте я покажу вам шаги, которые вы можете выполнить для анализа изображений, которые странным образом поворачиваются с помощью Python.

Давайте начнем!

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

Метаданные записываются в файл изображения с использованием формата файла изображения Exchangeable (Exif) . Многие интересные теги метаданных будут включены в ваше изображение, такие как марка и модель телефона, используемого для съемки фотографии, в дополнение к более интересным тегам! Таким образом, метаданные могут включать ценную информацию о вашем изображении.

Если вы хотите глубже вникнуть в данные Exif, Ассоциация производителей камер и продуктов для обработки изображений (CIPA) и Ассоциация индустрии информационных технологий (JEITA) совместно разработали стандарт: CIPA DC-008-Translation Формат сменных файлов изображений для цифровых фотоаппаратов: Exif Version 2.3 .

Теперь, когда мы знаем, что мы подразумеваем под метаданными, давайте продолжим и прочитаем некоторые теги метаданных на нашем изображении. Для целей данного урока я использую изображение ниже, которое было снято с помощью камеры мобильного телефона. Исходное изображение можно скачать с toy.jpg .

Reading Metadata

Как упоминалось выше, различные теги метаданных будут включены в изображение. Давайте напишем скрипт Python, который будет извлекать информацию о некоторых тегах метаданных из изображения выше. Что касается информации, скажем, мы хотим узнать больше о марке и модели мобильного телефона, с которого была сделана фотография, и о состоянии вспышки во время съемки. Для этого мы будем использовать модуль ExifTags , который является частью Python Imaging Library (PIL) .

Сначала я перечислю скрипт Python, а затем пошагово покажу код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
from PIL import Image
from PIL.ExifTags import TAGS
 
image = Image.open(‘toy.jpg’)
info = image._getexif()
 
for tag, value in info.items():
    key = TAGS.get(tag)
    if key == ‘Make’:
        print(key + ‘: ‘ + str(value))
    elif key == ‘Model’:
        print(key + ‘: ‘ + str(value))
    elif key == ‘Flash’:
        print(key + ‘: ‘ + str(value))

Первое, что мы сделали, это импортировали классы Image и TAGS . Класс Image используется для представления изображения PIL, а класс TAGS , как упомянуто в документации, отображает перечисления 16-разрядных целочисленных тегов EXIF ​​в описательные имена строк.

Затем мы переходим к чтению нашего изображения toy.jpg и используем ._getexif() которая возвращает словарь тегов и их значений . После этого перед печатью значения тега (ключа) мы проверяем, существует ли этот ключ на изображении как тег или нет.

Если вы хотите иметь список доступных тегов на изображении, вы можете просто добавить print key оператора под переменной key в цикле for . Какие еще теги вы могли увидеть после выполнения этого оператора?

Проверяя вывод вышеприведенного скрипта, вот что вы получите, если будете использовать toy.jpg :

1
2
3
Flash: 0
Make: samsung
Model: SAMSUNG-SM-N920A

Из полученных результатов мы знаем, что мобильный телефон, который использовался для съемки фотографии, был типа samsung и модели SAMSUNG-SM-N920A . Как насчет значения 0 для тега Flash ? Если мы обратимся к стандартному документу, указанному в разделе «Данные Exif» выше, то увидим, что значение 0 означает, что вспышка не сработала во время съемки фотографии.

Давайте перейдем к нашей основной теме: причина, по которой иногда вы можете обнаружить, что изображение, переданное с камеры мобильного телефона, поворачивается или имеет неправильную ориентацию. Мы можем выяснить причину этой проблемы, проанализировав данные Exif изображения.

Тег метаданных, который мы можем использовать для этой цели, — это « Orientation , которая на основе стандартного документа, на который есть ссылка, показывает ориентацию изображения в виде строк и столбцов . Чтобы проверить значение тега Orientation для нашего изображения, мы можем добавить следующие операторы в конец приведенного выше сценария:

1
2
elif key == ‘Orientation’:
       print(key + ‘: ‘ + str(value))

Приведенные выше утверждения возвращают Orientation: 1 . Возвращаясь к стандартному документу Exif, значение 1 означает:

0-й ряд находится в верхней части изображения, а 0-й столбец — в левой части экрана.

Чтобы сделать это более понятным, как описано в Exif Orientation Tag , вышеприведенное описание можно прочитать следующим образом: 0-я строка в сохраненном изображении является вершиной захваченной сцены, а 0-й столбец в сохраненном изображении является левой стороной захваченного изображения. сцена Другими словами, изображение не было повернуто по сути, поэтому у нас не будет проблем с ориентацией при передаче изображения с нашего мобильного телефона на рабочий стол. Документ « Поворот JPEG» и «Ориентация EXIF» дает хорошее объяснение тега ориентации Exif и его различных значений.

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

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