Cara Membuat Panorama Menakjubkan Dengan Python dan OpenCV
Table of content:
- Menyiapkan Lingkungan Python Anda
- Mengimpor Perpustakaan yang Diperlukan
- Memuat Gambar
- Mengubah Ukuran Gambar untuk Jahitan Seragam dan Pemrosesan Lebih Cepat
- Menggunakan Modul Stitcher OpenCV untuk Menjahit Gambar
- Memotong Gambar yang Dijahit
- Melihat Pratinjau dan Menyimpan Gambar yang Digabung Menggunakan OpenCV
- Mengontrol Alur Program Anda
- Menguji Program Anda
- Manipulasi Gambar Menggunakan OpenCV
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 pemahaman dasar tentang Python. Luncurkan IDE Python apa pun dan buat lingkungan virtual baru. Buat file Python baru. Dan di terminal, jalankan perintah berikut untuk menginstal OpenCV.
pip install 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.
Mengimpor Perpustakaan yang Diperlukan
Impor cv2 Dan os modul ke dalam skrip Anda. Anda akan menggunakan OS untuk menavigasi melalui jalur sistem.
import cv2
import os
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.
def load_images(folder_path):
images = []
for filename in os.listdir(folder_path):
if filename.endswith('.jpg') or filename.endswith('.png'):
image = cv2.imread(os.path.join(folder_path, filename))
images.append(image)
return images
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.
def resize_images(images, width, height):
resized_images = []
for image in images:
resized_image = cv2.resize(image, (width, height))
resized_images.append(resized_image)
return resized_images
Mengubah ukuran memastikan jahitan gambar seragam. Ini juga mengurangi ukuran file untuk pemrosesan lebih cepat.
Menggunakan Modul Stitcher 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.
def stitch_images(images):
stitcher = cv2.Stitcher.create()
(status, stitched_image) = stitcher.stitch(images)
if status == cv2.STITCHER_OK:
return stitched_image
else:
return None
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.
def crop_image(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)[1]
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect(contours[0])
cropped_image = image[y:y + h, x:x + w]
return 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.
def preview_and_save_image(image, folder_path, folder_name):
cv2.namedWindow('Stitched Image', cv2.WINDOW_NORMAL)
cv2.imshow('Stitched Image', image)
cv2.waitKey(0)
output_filename = os.path.join(folder_path, folder_name + '_panorama.jpg')
cv2.imwrite(output_filename, image)
print('Stitched image saved for folder:', folder_name)
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.
def stitch_folder(folder_path, width=800, height=800):
images = load_images(folder_path)
if len(images) < 2:
print('Not enough images in folder:', folder_path)
return
resized_images = resize_images(images, width, height)
stitched_image = stitch_images(resized_images)
if stitched_image is None:
print('Stitching failed for folder:', folder_path)
return
cropped_image = crop_image(stitched_image)
folder_name = os.path.basename(folder_path)
preview_and_save_image(cropped_image, folder_path, folder_name)
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.