Библиотека OpenCV Python позволила автоматизировать процесс объединения нескольких изображений в одно панорамное изображение.
Панорамная фотография — это метод захвата более широкого поля зрения, которого невозможно достичь с помощью одной фотографии. Этот метод сшивает несколько изображений вместе, чтобы создать одно изображение, которое захватывает всю сцену с эффектом присутствия.
С помощью Python вы можете автоматизировать этот процесс и с легкостью создавать красивые панорамы.
Настройка среды Python
Для выполнения необходимо иметь базовое понимание Python. Запустите любую Python IDE и создать новую виртуальную среду. Создайте новый файл Python. И на терминале выполните следующую команду, чтобы установить OpenCV.
pip установить opencv-contrib-python
Вы будете использовать opencv-contrib-python библиотека для загрузки изображений и управления ими. Он имеет cv2.Сшиватель класс, который вы будете использовать для создания панорам.
Полный исходный код и примеры изображений, использованные в этой статье, доступны в этом Репозиторий GitHub.
Импорт необходимых библиотек
Импортировать cv2 и Операционные системы модули в свой скрипт. Вы будете использовать ОС для навигации по системным путям.
Импортировать cv2
Импортировать Операционные системы
Модуль ОС является встроенным модулем Python. По этой причине вам не нужно устанавливать его извне.
Загрузка изображений
Создайте функцию для загрузки изображений, которые вы хотите сшить. Сначала создайте пустой список, в котором будут храниться исходные изображения. Затем прокрутите каждый файл в пути к папке, проверяя, является ли файл изображением. Если это изображение, загрузите и добавьте его в список изображений.
дефload_images(Путь к папке):
# Загрузите изображения из папки и измените их размер.
изображения = []
для имя файла в os.listdir (путь_папки):
# Проверить, является ли файл файлом изображения
если имя файла.заканчивается('.jpg') или имя файла.заканчивается('.png'):
# Загрузите изображение с помощью OpenCV и измените его размер
image = cv2.imread (os.path.join (путь_папки, имя файла))
images.append (изображение)
возвращаться изображений
Вы можете добавить больше форматов файлов изображений, чтобы разнообразить свою программу. Этот код будет искать только .jpg и .png форматы файлов.
Изменение размера изображений для равномерного стежка и более быстрой обработки
Создайте функцию, которая изменит размер списка изображений. Функция будет перебирать каждое изображение в списке и изменять его размер. Наконец, добавьте изображения с измененным размером в новый список.
дефresize_images(изображения, ширина, высота):
resized_images = []
для изображение в изображений:
resized_image = cv2.resize (изображение, (ширина, высота))
resized_images.append (измененное_изображение)
возвращаться resized_images
Изменение размера гарантирует, что сшивание изображений будет равномерным. Это также уменьшает размер файла для более быстрой обработки.
Использование модуля Stitcher OpenCV для сшивания изображений
Создайте функцию для сшивания изображений с измененным размером вместе. Этот метод широко известен как создание панорамы. Функция будет принимать список изображений в качестве входных данных. Использовать Сшиватель модуль, чтобы сшить их вместе. Наконец, функция вернет сшитое изображение и код состояния.
дефстежка_изображения(изображений):
сшиватель = cv2.Stitcher.create ()
(статус, сшитое_изображение) = сшиватель.стежка (изображения)
если статус == cv2.STITCHER_OK:
возвращаться сшитое_изображение
еще:
возвращатьсяНикто
Если сшивка прошла успешно (как указано cv2.STITCHER_OK код состояния), функция вернет сшитое изображение. В противном случае он вернется Никто.
Обрезка сшитого изображения
Создайте функцию, которая будет принимать сшитое изображение и возвращать его после обрезки. Сначала преобразуйте сшитое изображение в оттенки серого. Затем примените двоичный порог для создания двоичного изображения. Наконец, найдите самый большой контур в бинарном изображении и вычислите его ограничивающий прямоугольник.
дефобрезать изображение(изображение):
серый = cv2.cvtColor (изображение, cv2.COLOR_BGR2GRAY)
порог = cv2.threshold (серый, 0, 255, cv2.THRESH_BINARY)[1]
контуры = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) [0]
x, y, w, h = cv2.boundingRect (контуры [0])
Cropped_image = изображение [у: у + ч, х: х + ш]
возвращаться croped_image
Сшитое изображение обрезается по ограничивающему прямоугольнику.
Предварительный просмотр и сохранение сшитого изображения с помощью OpenCV
Создайте функцию, которая будет отображать сшитое изображение в интерактивном окне и сохранять его на диск.
дефpreview_and_save_image(изображение, путь_к_папке, имя_папки):
# Показать сшитое изображение
cv2.namedWindow(«Сшитое изображение», cv2.WINDOW_NORMAL)
cv2.imshow («Сшитое изображение», изображение)
cv2.waitKey(0)
# Сохраняем сшитое изображение
output_filename = os.path.join (путь_папки, имя_папки + '_panorama.jpg')
cv2.imwrite (имя выходного_файла, изображение)
Распечатать('Сшитое изображение сохранено для папки:', имя папки)
Панорамное изображение сохраняется в той же папке, что и исходные изображения.
Управление потоком вашей программы
Создайте функцию, которая будет управлять потоком вашей программы. Он загрузит все изображения из указанной папки. Измените размер и сшейте их вместе. Обрежьте сшитое изображение, отобразите его предварительный просмотр, а затем сохраните на диск. Если в папке меньше двух изображений, функция напечатает сообщение об ошибке и вернется без выполнения какого-либо сшивания или сохранения.
дефпапка_стежка(путь_папки, ширина=800, высота =800):
# Сшиваем все изображения в папку и сохраняем результат.
# Загружаем изображения из папки
изображения = load_images (путь_к_папке)# Проверяем, есть ли в папке хотя бы два изображения
если Лен (изображения) < 2:
Распечатать(«Недостаточно изображений в папке:», Путь к папке)
возвращаться# Изменить размер изображений
resized_images = resize_images (изображения, ширина, высота)# Сшиваем изображения
сшитое_изображение = сшиваемые_изображения (измененные_изображения)
если сшитое_изображение являетсяНикто:
Распечатать('Сшивка не удалась для папки:', Путь к папке)
возвращаться# Обрезать сшитое изображение
кадрированное_изображение = кадрированное_изображение (сшитое_изображение)
# Предварительный просмотр и сохранение сшитого изображения
имя_папки = os.path.basename (путь_папки)
preview_and_save_image (обрезанное_изображение, путь_к_папке, имя_папки)
Передайте путь к папке, содержащей изображения, которые вы хотите сшить.
папка_стежка ('sample_images')
Используемые изображения должны содержать перекрывающиеся функции. Этими функциями могут быть что угодно, от выдающихся ориентиров до текстурных узоров на изображении. OpenCV использует их в качестве ориентира для выравнивания изображений.
Без этих функций OpenCV будет сложно выровнять изображения и создать цельную панораму.
Тестирование вашей программы
Соберите изображения, которые вы хотите преобразовать в панорамное изображение. Убедитесь, что они имеют перекрывающиеся функции.
Взгляните на холм на этом первом изображении.
На этом втором изображении холм слегка виден. Это создает перекрывающийся элемент.
Сохраните изображения в папку. Передайте путь к папке папка_стежка функция для сшивания. А затем запустить программу.
Программа объединила изображения вместе и создала панорамное изображение с более широким обзором сцены. Обратите внимание, что для создания вышеуказанного панорамного изображения использовались девять изображений, присутствующих в вышеупомянутом репозитории GitHub.
Манипуляции с изображениями с помощью OpenCV
Создание панорам демонстрирует некоторые из многих методов обработки изображений, которые предлагает OpenCV. Есть и другие методы, которые вы можете использовать для управления изображениями в соответствии с вашими потребностями. Работа над большим количеством проектов, связанных с обработкой изображений, поможет вам улучшить свои навыки компьютерного зрения в целом.