Biblioteka OpenCV Python umożliwiła zautomatyzowanie procesu łączenia wielu obrazów w jeden obraz panoramiczny.

Fotografia panoramiczna to technika uchwycenia szerszego pola widzenia, którego nie można uzyskać na pojedynczym zdjęciu. Technika ta łączy ze sobą wiele obrazów, tworząc jeden obraz, który uchwyci całą scenę w wciągający sposób.

Z pomocą Pythona możesz zautomatyzować ten proces i z łatwością tworzyć piękne panoramy.

Konfigurowanie środowiska Pythona

Aby kontynuować, powinieneś mieć podstawowa znajomość Pythona. Uruchom dowolne Python IDE i stworzyć nowe środowisko wirtualne. Utwórz nowy plik Pythona. Na terminalu uruchom następujące polecenie, aby zainstalować OpenCV.


pip zainstaluj opencv-contrib-python

Będziesz korzystać z opencv-contrib-python bibliotekę do ładowania obrazów i manipulowania nimi. To ma cv2.Stitcher klasa, której użyjesz do stworzenia panoram.

Pełny kod źródłowy i przykładowe obrazy użyte w tym artykule są dostępne w this Repozytorium GitHub.

Importowanie wymaganych bibliotek

Importuj cv2 I os moduły do ​​swojego skryptu. Będziesz używać systemu operacyjnego do poruszania się po ścieżkach systemowych.

import cv2
import os

The Moduł systemu operacyjnego jest wbudowanym modułem Pythona. To jest powód, dla którego nie musisz instalować go na zewnątrz.

Ładowanie obrazów

Utwórz funkcję ładowania obrazów, które chcesz zszyć. Najpierw utwórz pustą listę, która będzie przechowywać początkowe obrazy. Następnie przejrzyj każdy plik w ścieżce folderu, sprawdzając, czy plik jest obrazem. Jeśli jest to obraz, załaduj go i dołącz do listy obrazów.


pokZaładuj obrazki(ścieżkę foldera):
# Załaduj obrazy z folderu i zmień ich rozmiar.
obrazy = []
Do Nazwa pliku W os.listdir (ścieżka_folderu):
# Sprawdź, czy plik jest plikiem obrazu
Jeśli nazwa_pliku.kończy się(„.jpg”) Lub nazwa_pliku.kończy się('.png'):
# Załaduj obraz za pomocą OpenCV i zmień jego rozmiar
image = cv2.imread (os.path.join (ścieżka_folderu, nazwa pliku))
images.append (obraz)
powrót obrazy

Możesz dodać więcej formatów plików graficznych, aby urozmaicić swój program. Ten kod będzie tylko szukał jpg I png formaty plików.

Zmiana rozmiaru obrazów w celu uzyskania jednolitego ściegu i szybszego przetwarzania

Utwórz funkcję, która zmieni rozmiar listy obrazów. Funkcja przejdzie przez każdy obraz na liście i zmieni jego rozmiar. Na koniec dołącz obrazy o zmienionym rozmiarze do nowej listy.


pokzmień rozmiar_obrazów(zdjęcia, szerokość, wysokość):
obrazy o zmienionym rozmiarze = []
Do obraz W obrazy:
resized_image = cv2.resize (obraz, (szerokość, wysokość))
resized_images.append (resized_image)
powrót obrazy o zmienionym rozmiarze

Zmiana rozmiaru zapewnia jednolite łączenie obrazów. Zmniejsza również rozmiar pliku w celu szybszego przetwarzania.

Używanie modułu Stitcher OpenCV do łączenia obrazów

Utwórz funkcję łączenia ze sobą obrazów o zmienionym rozmiarze. Ta technika jest powszechnie znana jako tworzenie panoramy. Funkcja pobierze listę obrazów jako dane wejściowe. Użyj Zszywacz moduł do ich łączenia. Na koniec funkcja zwróci zszyty obraz i kod stanu.


pokobrazy_ściegów(obrazy):
zszywacz = cv2.Stitcher.create()
(status, stitched_image) = stitcher.stitch (obrazy)
Jeśli status == cv2.STITCHER_OK:
powrót zszyty_obraz
w przeciwnym razie:
powrótNic

Jeśli szycie powiodło się (jak wskazuje symbol cv2.STITCHER_OK kod stanu), funkcja zwróci zszyty obraz. W przeciwnym razie powróci Nic.

Przycinanie zszytego obrazu

Utwórz funkcję, która przyjmie zszyty obraz i zwróci go po przycięciu. Najpierw przekonwertuj zszyty obraz na skalę szarości. Następnie zastosuj próg binarny, aby utworzyć obraz binarny. Na koniec znajdź największy kontur w obrazie binarnym i oblicz jego prostokąt ograniczający.


pokPrzytnij zdjęcie(obraz):
szary = cv2.cvtColor (obraz, cv2.COLOR_BGR2GRAY)
próg = cv2.threshold (szary, 0, 255, cv2.THRESH_BINARY)[1]
kontury = cv2.findContours (młot, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (kontury[0])
przycięty_obraz = obraz [y: y + h, x: x + w]
powrót przycięty_obraz

Zszyty obraz jest przycinany za pomocą prostokąta ograniczającego.

Podgląd i zapisywanie zszytego obrazu za pomocą OpenCV

Utwórz funkcję, która wyświetli zszyty obraz w interaktywnym oknie i zapisze go na dysku.


pokpodgląd_i_zapis_obrazu(obraz, ścieżka_folderu, nazwa_folderu):
# Wyświetl zszyty obraz
cv2.namedWindow(„Zszyty obraz”, cv2.WINDOW_NORMAL)
cv2.imshow(„Zszyty obraz”, obraz)
cv2.waitKey(0)

# Zapisz zszyty obraz
nazwa_pliku_wyjściowego = os.ścieżka.join (ścieżka_folderu, nazwa_folderu + „_panorama.jpg”)
cv2.imwrite (nazwa_pliku_wyjściowego, obraz)
wydrukować(„Zszyty obraz zapisany w folderze:”, Nazwa folderu)

Obraz panoramy jest zapisywany w tym samym folderze, w którym znajdują się oryginalne obrazy.

Kontrolowanie przebiegu Twojego programu

Utwórz funkcję, która będzie sterować przebiegiem Twojego programu. Załaduje wszystkie obrazy z określonego folderu. Zmień rozmiar i zszyj je razem. Przytnij zszyty obraz, wyświetl jego podgląd, a następnie zapisz go na dysku. Jeśli w folderze znajdują się mniej niż dwa obrazy, funkcja wydrukuje komunikat o błędzie i powróci bez łączenia lub zapisywania.


pokfolder_ściegów(ścieżka_folderu, szerokość=800, wysokość=800):
# Zszyj wszystkie obrazy w folderze i zapisz wynik.
# Załaduj obrazy z folderu
obrazy = ładuj_obrazy (ścieżka_folderu)

# Sprawdź, czy w folderze znajdują się co najmniej dwa obrazy
Jeśli len (obrazy) < 2:
wydrukować(„Za mało obrazów w folderze:”, ścieżkę foldera)
powrót

# Zmień rozmiar obrazów
resized_images = resize_images (obrazy, szerokość, wysokość)

# Zszyj obrazy
zszyty_obraz = zszyty_obraz (zdjęcia o zmienionym rozmiarze)
Jeśli zszyty_obraz JestNic:
wydrukować(„Łączenie nie powiodło się dla folderu:”, ścieżkę foldera)
powrót

# Przytnij zszyty obraz
przycięty_obraz = przycięty_obraz (zszyty_obraz)

# Wyświetl podgląd i zapisz zszyty obraz
nazwa_folderu = os.ścieżka.nazwa_podstawowa (ścieżka_folderu)
preview_and_save_image (przycięty_obraz, ścieżka_folderu, nazwa_folderu)

Podaj ścieżkę folderu zawierającą obrazy, które chcesz zszyć.

stitch_folder('przykładowe_obrazy') 

Obrazy, których używasz, powinny zawierać nakładające się elementy. Cechy te mogą obejmować wszystko, od charakterystycznych punktów orientacyjnych po wzory tekstur na obrazie. OpenCV używa ich jako punktu odniesienia do wyrównania obrazów.

Bez tych funkcji OpenCV będzie miał trudności z wyrównaniem obrazów i utworzeniem płynnej panoramy.

Testowanie twojego programu

Zbierz obrazy, które chcesz przekształcić w zdjęcie panoramiczne. Upewnij się, że mają nakładające się funkcje.

Spójrz na wzgórze na pierwszym zdjęciu.

Na tym drugim zdjęciu wzgórze jest słabo widoczne. Tworzy to nakładającą się funkcję.

Zapisz obrazy w folderze. Przekaż ścieżkę folderu do folder_ściegów funkcja szycia. A następnie uruchom program.

Program połączył obrazy i utworzył zdjęcie panoramiczne z szerszym widokiem sceny. Zwróć uwagę, że do stworzenia powyższego zdjęcia panoramicznego wykorzystano dziewięć obrazów, które znajdują się we wspomnianym repozytorium GitHub.

Manipulacja obrazami za pomocą OpenCV

Tworzenie panoram demonstruje niektóre z wielu technik manipulacji obrazami, które oferuje OpenCV. Istnieje więcej technik, których możesz użyć do manipulowania obrazami, aby dopasować je do swoich potrzeb. Praca nad większą liczbą projektów obejmujących manipulację obrazami pomoże ci ogólnie poprawić umiejętności widzenia komputerowego.