Pustaka OpenCV Python telah memungkinkan untuk mengotomatiskan proses penggabungan beberapa gambar menjadi satu gambar panorama.

Fotografi panorama adalah teknik menangkap bidang pandang yang lebih luas yang tidak dapat dicapai oleh satu foto. Teknik ini menyatukan banyak gambar untuk membuat satu gambar yang menangkap seluruh pemandangan dengan cara yang imersif.

Dengan bantuan Python, Anda dapat mengotomatiskan proses ini dan membuat panorama indah dengan mudah.

Menyiapkan Lingkungan Python Anda

Untuk menindaklanjuti, Anda harus memiliki a pemahaman dasar tentang Python. Luncurkan IDE Python apa saja dan membuat lingkungan virtual baru. Buat file Python baru. Dan di terminal, jalankan perintah berikut untuk menginstal OpenCV.


pip instal opencv-contrib-python

Anda akan menggunakan opencv-contrib-python perpustakaan untuk memuat gambar dan memanipulasinya. Ini memiliki cv2.Stitcher kelas yang akan Anda gunakan untuk membuat panorama.

Kode sumber lengkap dan contoh gambar yang digunakan dalam artikel ini tersedia di sini repositori GitHub.

instagram viewer

Mengimpor Perpustakaan yang Diperlukan

Impor cv2 Dan os modul ke dalam skrip Anda. Anda akan menggunakan OS untuk menavigasi melalui jalur sistem.

impor cv2
impor os

Itu modul OS adalah modul bawaan Python. Inilah alasan mengapa Anda tidak perlu menginstalnya secara eksternal.

Memuat Gambar

Buat fungsi untuk memuat gambar yang ingin Anda gabungkan. Pertama, buat daftar kosong yang akan menyimpan gambar awal. Kemudian lewati setiap file di jalur folder untuk memeriksa apakah file tersebut adalah gambar. Jika itu adalah gambar, muat dan tambahkan ke daftar gambar.


defmemuat gambar(folder_path):
# Muat gambar dari folder dan ubah ukurannya.
gambar = []
untuk nama file di dalam os.listdir (folder_path):
# Periksa apakah file adalah file gambar
jika namafile.diakhiri dengan('.jpg') atau namafile.diakhiri dengan('.png'):
# Muat gambar menggunakan OpenCV dan ubah ukurannya
gambar = cv2.imread (os.path.join (folder_path, nama file))
gambar.tambahkan (gambar)
kembali gambar-gambar

Anda dapat menambahkan lebih banyak format file gambar untuk mendiversifikasi program Anda. Kode ini hanya akan mencari .jpg Dan .png format file.

Mengubah Ukuran Gambar untuk Jahitan Seragam dan Pemrosesan Lebih Cepat

Buat fungsi yang akan mengubah ukuran daftar gambar. Fungsi akan mengulang setiap gambar dalam daftar dan mengubah ukurannya. Terakhir, tambahkan gambar yang diubah ukurannya ke daftar baru.


defubah ukuran_gambar(gambar, lebar, tinggi):
gambar_diubah ukurannya = []
untuk gambar di dalam gambar-gambar:
resized_image = cv2.resize (gambar, (lebar, tinggi))
resized_images.append (resized_images)
kembali gambar_diubah ukurannya

Mengubah ukuran memastikan jahitan gambar seragam. Ini juga mengurangi ukuran file untuk pemrosesan lebih cepat.

Menggunakan Modul Penggabung OpenCV untuk Menjahit Gambar

Buat fungsi untuk menyatukan gambar yang diubah ukurannya. Teknik ini biasa dikenal dengan pembuatan panorama. Fungsi ini akan mengambil daftar gambar sebagai masukan. Menggunakan Mesin penjahit modul untuk menjahit mereka bersama-sama. Terakhir, fungsi tersebut akan mengembalikan gambar yang digabungkan dan kode status.


defstitch_images(gambar-gambar):
penjahit = cv2.Stitcher.create()
(status, stitched_image) = stitcher.stitch (gambar)
jika status == cv2.STITCHER_OK:
kembali stitched_image
kalau tidak:
kembaliTidak ada

Jika penjahitan berhasil (seperti yang ditunjukkan oleh cv2.STITCHER_OK kode status), fungsi akan mengembalikan gambar yang digabungkan. Jika tidak, itu akan kembali Tidak ada.

Memotong Gambar yang Dijahit

Buat fungsi yang akan mengambil gambar yang dijahit dan mengembalikannya setelah memotongnya. Pertama, ubah gambar yang digabungkan menjadi skala abu-abu. Kemudian terapkan ambang batas biner untuk membuat gambar biner. Terakhir, temukan kontur terbesar pada citra biner dan hitung persegi panjang pembatasnya.


defcrop_image(gambar):
abu-abu = cv2.cvtColor (gambar, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold (abu-abu, 0, 255, cv2.THRESH_BINARY)[1]
kontur = cv2.findContours (mengirik, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (kontur[0])
cropped_image = gambar[y: y + h, x: x + w]
kembali cropped_image

Gambar yang dijahit dipotong menggunakan persegi panjang pembatas.

Melihat Pratinjau dan Menyimpan Gambar yang Digabung Menggunakan OpenCV

Buat fungsi yang akan menampilkan gambar yang digabungkan dalam jendela interaktif dan akan menyimpannya ke disk.


defpreview_and_save_image(gambar, jalur_folder, nama_folder):
# Tampilkan gambar yang dijahit
cv2.bernamaWindow('Gambar Terjahit', cv2.WINDOW_NORMAL)
cv2.imshow('Gambar Terjahit', gambar)
cv2.waitKey(0)

# Simpan gambar yang dijahit
output_filename = os.path.join (folder_path, folder_name + '_panorama.jpg')
cv2.imwrite (nama_berkas keluaran, gambar)
mencetak('Gambar yang digabungkan disimpan untuk folder:', nama folder)

Gambar panorama disimpan dalam folder yang sama yang berisi gambar aslinya.

Mengontrol Alur Program Anda

Buat fungsi yang akan mengontrol aliran program Anda. Ini akan memuat semua gambar dari folder yang ditentukan. Ubah ukuran dan gabungkan keduanya. Pangkas gambar yang digabungkan, tampilkan pratinjaunya, lalu simpan ke disk. Jika ada kurang dari dua gambar dalam folder, fungsi akan mencetak pesan kesalahan dan mengembalikannya tanpa melakukan penjahitan atau penyimpanan.


defstitch_folder(folder_path, lebar=800, tinggi =800):
# Jahit semua gambar dalam folder dan simpan hasilnya.
# Muat gambar dari folder
gambar = load_images (folder_path)

# Periksa apakah setidaknya ada dua gambar di dalam folder
jika len (gambar) < 2:
mencetak('Tidak cukup gambar dalam folder:', folder_path)
kembali

# Ubah ukuran gambar
resized_images = resize_images (gambar, lebar, tinggi)

# Jahit gambar
stitched_image = stitch_images (gambar_diubah ukurannya)
jika stitched_image adalahTidak ada:
mencetak('Gagal menjahit folder:', folder_path)
kembali

# Pangkas gambar yang dijahit
cropped_image = crop_image (gambar_terjahit)

# Pratinjau dan simpan gambar yang dijahit
folder_name = os.path.basename (folder_path)
preview_and_save_image (cropped_image, folder_path, nama_folder)

Lewati jalur folder yang berisi gambar yang ingin Anda gabungkan.

stitch_folder('sample_images') 

Gambar yang Anda gunakan harus berisi fitur yang tumpang tindih. Fitur ini dapat berupa apa saja, mulai dari bangunan terkenal hingga pola tekstur pada gambar. OpenCV menggunakannya sebagai titik referensi untuk menyelaraskan gambar.

Tanpa fitur ini, akan sulit bagi OpenCV untuk menyelaraskan gambar dan membuat panorama tanpa batas.

Menguji Program Anda

Kumpulkan gambar yang ingin Anda ubah menjadi gambar panorama. Pastikan bahwa mereka memiliki fitur yang tumpang tindih.

Lihatlah bukit di gambar pertama ini.

Pada gambar kedua ini, bukitnya sedikit terlihat. Ini menciptakan fitur yang tumpang tindih.

Simpan gambar ke folder. Lewati jalur folder ke stitch_folder fungsi untuk menjahit. Dan kemudian jalankan programnya.

Program ini menyatukan gambar dan membuat gambar panorama dengan tampilan pemandangan yang lebih luas. Perhatikan bahwa untuk membuat gambar panorama di atas, sembilan gambar digunakan yang ada di repositori GitHub yang disebutkan di atas.

Manipulasi Gambar Menggunakan OpenCV

Membuat panorama mendemonstrasikan beberapa dari banyak teknik manipulasi gambar yang ditawarkan OpenCV. Ada lebih banyak teknik yang dapat Anda gunakan untuk memanipulasi gambar agar sesuai dengan kebutuhan Anda. Mengerjakan lebih banyak proyek yang melibatkan manipulasi gambar akan membantu Anda meningkatkan keterampilan visi komputer secara umum.