Библиотеката OpenCV Python направи възможно автоматизирането на процеса на обединяване на множество изображения в едно панорамно изображение.

Панорамната фотография е техника за улавяне на по-широко зрително поле, което не може да се постигне с една снимка. Тази техника свързва множество изображения заедно, за да създаде едно изображение, което улавя цялата сцена по завладяващ начин.

С помощта на Python можете да автоматизирате този процес и да създавате красиви панорами с лекота.

Настройване на вашата Python среда

За да продължите, трябва да имате a основно разбиране на Python. Стартирайте всяка Python IDE и създайте нова виртуална среда. Създайте нов Python файл. И на терминала изпълнете следната команда, за да инсталирате OpenCV.


pip инсталирайте opencv-contrib-python

Вие ще използвате opencv-contrib-python библиотека за зареждане на изображения и манипулиране с тях. Има cv2.Stitcher клас, който ще използвате за създаване на панорами.

Пълният изходен код и примерни изображения, използвани в тази статия, са налични в това GitHub хранилище.

instagram viewer

Импортиране на необходимите библиотеки

Импортирайте cv2 и операционна система модули във вашия скрипт. Ще използвате ОС за навигация през системните пътища.

импортиране cv2
импортиране операционна система

The OS модул е вграден модул на Python. Това е причината да не е необходимо да го инсталирате външно.

Зареждане на изображенията

Създайте функция за зареждане на изображенията, които искате да съедините. Първо създайте празен списък, който ще съхранява първоначалните изображения. След това преминете през всеки файл в пътя на папката, като проверите дали файлът е изображение. Ако е изображение, заредете го и го добавете към списъка с изображения.


дефload_images(път_папка):
# Заредете изображения от папка и ги преоразмерете.
изображения = []
за име на файл в os.listdir (път_папка):
# Проверете дали файлът е файл с изображение
ако filename.endswith(„.jpg“) или filename.endswith(".png"):
# Заредете изображението с помощта на OpenCV и го преоразмерете
изображение = cv2.imread (os.path.join (път_папка, име на файл))
images.append (изображение)
връщане изображения

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

Преоразмеряване на изображенията за еднакъв шев и по-бърза обработка

Създайте функция, която ще преоразмерява списъка с изображения. Функцията ще премине през всяко изображение в списъка и ще го преоразмери. Накрая добавете преоразмерените изображения към нов списък.


дефresize_images(изображения, ширина, височина):
преоразмерени_изображения = []
за изображение в изображения:
resized_image = cv2.resize (изображение, (ширина, височина))
resized_images.append (resized_image)
връщане преоразмерени_изображения

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

Използване на модула Stitcher на OpenCV за свързване на изображения

Създайте функция за съединяване на преоразмерените изображения. Тази техника е известна като създаване на панорама. Функцията ще приеме списък с изображения като вход. Използвай Шивачка модул, за да ги зашиете заедно. Накрая функцията ще върне съединено изображение и код на състоянието.


дефstitch_images(изображения):
stitcher = cv2.Stitcher.create()
(статус, stitched_image) = stitcher.stitch (изображения)
ако състояние == cv2.STITCHER_OK:
връщане stitched_image
друго:
връщанеНито един

Ако зашиването е било успешно (както е посочено от cv2.STITCHER_OK код на състоянието), функцията ще върне съединеното изображение. В противен случай ще се върне Нито един.

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

Създайте функция, която ще вземе съшитото изображение и ще го върне след изрязването му. Първо преобразувайте съшитото изображение в сива скала. След това приложете двоичен праг, за да създадете двоично изображение. Накрая намерете най-големия контур в двоичното изображение и изчислете неговия ограничаващ правоъгълник.


дефизрязване на изображението(изображение):
сиво = cv2.cvtColor (изображение, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold (сив, 0, 255, cv2.THRESH_BINARY)[1]
contours = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (контури[0])
изрязано_изображение = изображение [y: y + h, x: x + w]
връщане изрязано_изображение

Свързаното изображение се изрязва с помощта на ограничителния правоъгълник.

Преглед и запазване на съединеното изображение с помощта на OpenCV

Създайте функция, която ще покаже сшитото изображение в интерактивен прозорец и ще го запише на диска.


дефpreview_and_save_image(изображение, път_на_папка, име_на_папка):
# Показване на съединеното изображение
cv2.namedWindow(„Сглобено изображение“, cv2.WINDOW_NORMAL)
cv2.imshow(„Сглобено изображение“, изображение)
cv2.waitKey(0)

# Запазете зашитото изображение
име_на_изход = os.path.join (път_на_папка, име_на_папка + '_panorama.jpg')
cv2.imwrite (име на изходен_файл, изображение)
печат („Сглобено изображение, запазено за папка:“, име на папка)

Панорамното изображение се записва в същата папка, която съдържа оригиналните изображения.

Контролиране на потока на вашата програма

Създайте функция, която ще контролира потока на вашата програма. Той ще зареди всички изображения от посочената папка. Преоразмерете ги и ги зашийте заедно. Изрежете съшитото изображение, покажете визуализацията му и след това го запазете на диск. Ако в папката има по-малко от две изображения, функцията ще отпечата съобщение за грешка и ще се върне, без да извършва сглобяване или запазване.


дефпапка_бод(път_папка, ширина=800, височина=800):
# Свържете всички изображения в папка и запазете резултата.
# Заредете изображенията от папката
изображения = зареждане_изображения (път_папка)

# Проверете дали има поне две изображения в папката
ако len (изображения) < 2:
печат („Няма достатъчно изображения в папката:“, път_на_папка)
връщане

# Преоразмерете изображенията
resized_images = resize_images (изображения, ширина, височина)

# Свържете изображенията
stitched_image = stitch_images (преоразмерени_изображения)
ако stitched_image еНито един:
печат („Неуспешно свързване за папка:“, път_на_папка)
връщане

# Изрежете зашитото изображение
изрязано_изображение = изрязано_изображение (зашито_изображение)

# Прегледайте и запазете зашитото изображение
име_на_папка = os.path.basename (път_на_папка)
preview_and_save_image (изрязано_изображение, път_на_папка, име_на_папка)

Предайте пътя на папката, съдържащ изображенията, които искате да съедините.

stitch_folder('sample_images') 

Изображенията, които използвате, трябва да съдържат припокриващи се елементи. Тези характеристики могат да бъдат всичко - от видни забележителности до текстурни модели в изображението. OpenCV ги използва като отправна точка за подравняване на изображенията.

Без тези функции ще бъде трудно за OpenCV да подравни изображенията и да създаде безпроблемна панорама.

Тестване на вашата програма

Съберете изображенията, които искате да трансформирате в панорамно изображение. Уверете се, че имат припокриващи се функции.

Погледнете хълма в това първо изображение.

На това второ изображение хълмът е леко видим. Това създава припокриваща се характеристика.

Запазете изображенията в папка. Предайте пътя на папката към папка_бод функция за шиене. И след това стартирайте програмата.

Програмата свърза изображенията и създаде панорамно изображение с по-широк изглед на сцената. Обърнете внимание, че за създаването на горното панорамно изображение са използвани девет изображения, които присъстват в гореспоменатото хранилище на GitHub.

Манипулиране на изображения с помощта на OpenCV

Създаването на панорами демонстрира някои от многото техники за манипулиране на изображения, които OpenCV предлага. Има повече техники, които можете да използвате, за да манипулирате изображения според нуждите си. Работата по повече проекти, включващи манипулиране на изображения, ще ви помогне да подобрите уменията си за компютърно зрение като цяло.