title | author | date |
---|---|---|
Penyambungan Otomatis Citra Mikroskop |
Auriza Akbar |
2019 |
Untuk menyambungkan beberapa citra, diperlukan algoritme pengolahan citra berikut (Brown dan Lowe 2007)1:
- ekstraksi ciri dengan scale-invariant feature transform (SIFT)
- estimasi homografi atau transformasi affine dengan random sample consensus (Ransac)
- optimisasi sambungan antar-citra dengan bundle adjustment dan blending
Salah satu implementasi algoritme ini adalah OpenPano yang ditulis oleh Wu (2019)2.
Kode sumber OpenPano ditulis dengan bahasa C++ dari dasar. Sebelum bisa menjalankannya, kode sumber tersebut harus dikompilasi terlebih dahulu. Berikut perintah kompilasinya pada Ubuntu Linux 18.04.
# instal dependensi
sudo apt install cmake libeigen3-dev
# unduh dan ekstrak
wget https://github.com/ppwwyyxx/OpenPano/archive/master.zip
unzip master.zip
# kompilasi
make -C OpenPano-master/src
# salin hasilnya ke direktori /usr/local
sudo cp OpenPano-master/src/image-stitching /usr/local/bin
sudo cp OpenPano-master/src/config.cfg /usr/local/etc
Setelah kompilasi berhasil, akan didapatkan program baru dengan nama image-stitching
.
File konfigurasi config.cfg
harus disalin ke direktori kerja sebelum menjalankan program.
OpenPano memiliki pilihan tiga mode penyambungan dengan syaratnya:
- silinder: tidak ada perpindahan pada kamera, citra diambil dari kiri ke kanan dan harus terurut
- estimasi: tidak ada perpindahan pada kamera, citra tidak terurut namun lebih lambat
- translasi: kamera hanya melakukan perpindahan dengan kedalaman citra sama, citra harus terurut
Mode default OpenPano adalah estimasi.
Namun, untuk kasus penyambungan citra mikroskop, lebih tepat digunakan mode translasi.
Hal ini karena citra mikroskop diambil dengan cara menggeser-geser objek.
Berikut perubahan konfigurasi pada file config.cfg
untuk beralih ke mode translasi.
CYLINDER 0
ESTIMATE_CAMERA 0
TRANS 1
ORDERED_INPUT 1
Syarat citra masukan:
- format PNG atau JPEG
- terurut secara bersambung (mengular)
- beririsan ciri minimal 10%
Citra harus diberikan nama file yang menggambarkan urutannya. Berikut adalah contoh urutan citra yang benar.
Sebelum menjalankan program, file konfigurasi config.cfg
harus disalin dahulu ke direktori kerja.
Kemudian, penyambungan citra dilakukan dengan memanggil program image-stitching
dengan parameter semua nama citra yang akan disambung.
Untuk dapat tersambung dengan baik, antara kedua citra harus beririsan ciri minimal 10%.
Setelah berhasil, akan dihasilkan citra keluaran dengan nama file out.jpg
.
cp /usr/local/etc/config.cfg .
image-stitching *.png
Berikut contoh citra masukan T1 yang terdiri atas 44 citra dan hasil keluarannya dengan menggunakan konfigurasi mode translasi. Tiap citra masukan berdimensi 1280×960 piksel. Citra keluaran berdimensi 5118×3879 piksel. Proses penyambungan citra mode translasi membutuhkan waktu CPU sebesar 1.4 menit pada prosesor Intel i7-4770 3.40 GHz.
Percobaan pada mode estimasi memerlukan waktu CPU yang lebih lama sebesar 9.5 menit. Meskipun hasil sambungannya relatif lebih bagus, namun waktu yang sangat lama membuat mode estimasi tidak praktis untuk jumlah citra masukan yang banyak. Mode estimasi tidak mensyaratkan citra harus terurut, akibatnya kompleksitas menjadi kuadratik karena harus melakukan pairwise matching pada tiap citra masukan. Selain itu, mode estimasi akan mendistorsi citra hasil seperti bentuk lensa. Hal ini terlihat dari bentuk citra yang melengkung terutama pada bagian pinggir, sehingga tidak lurus lagi seperti yang diharapkan.
Pada citra hasil mode translasi terlihat garis-garis mendatar pada sambungan antar-citra.
Hal ini karena tujuan awal OpenPano adalah untuk menyambungkan citra panorama dari kiri ke kanan secara horizontal, bukan dari atas ke bawah.
Oleh karena itu, diperlukan penambahan blending secara vertikal pada mode translasi dengan cara menghapus kode program baris ke-34 pada file src/stitch/blender.cc
seperti di bawah ini.
Setelah itu kode program OpenPano dikompilasi ulang.
--- old/src/stitch/blender.cc
+++ new/src/stitch/blender.cc
@@ -32,5 +32,4 @@
if (color.x < 0) continue; \
float w = 0.5 - fabs(c / img.imgref.width() - 0.5); \
- if (not config::ORDERED_INPUT) /* blend both direction */\
w *= (0.5 - fabs(r / img.imgref.height() - 0.5)); \
color *= w
Berikut adalah hasil mode translasi dengan penambahan blending vertikal. Garis mendatar pada hasil sebelumnya sudah hilang, sehingga kualitasnya sama dengan mode estimasi. Waktu CPU yang dibutuhkan pun relatif sama dengan metode translasi biasa.
Pada contoh di atas, program berjalan dengan sukses karena semua citra berhasil disambungkan. Namun, pada banyak kasus terdapat citra yang gagal disambungkan dengan citra sebelumnya. Berikut contoh pesan kesalahan program jika menemukan kasus kegagalan tersebut.
error: Image 7 and 8 don't match
Sayangnya jika terjadi kegagalan, program akan langsung keluar tanpa melakukan langkah lebih lanjut. Citra yang dihapus biasanya memiliki fitur yang sedikit, sehingga tidak bisa disambungkan dengan citra berikutnya. Oleh karena itu, diperlukan metode tambahan untuk melanjutkan proses penyambungan jika terjadi kegagalan.
Metode pertama sederhana, misalnya jika terdapat kegagalan penyambungan antara citra 7 dan 8, maka hapus citra nomor 8 dan jalankan kembali penyambungan dari awal. Demikian seterusnya sampai menyisakan kumpulan citra yang berhasil tersambung semuanya. Namun biasanya setelah citra 8 dihapus, citra 7 dan 9 akan gagal juga disambungkan, sehingga kegagalan akan berlanjut sampai akhir.
Untuk mengatasinya, diperlukan metode baru dalam mengatasi kegagalan penyambungan. Metode kedua akan menghapus dengan mempertimbangkan nomor citra yang sudah dihapus sebelumnya. Misalnya citra 7 dan 8 gagal disambungkan, maka citra nomor 8 dihapus seperti biasa. Selanjutnya jika citra 7 dan 9 gagal disambungkan, maka citra nomor 7 yang akan dihapus, karena nomornya sama dengan nomor citra yang gagal sebelumnya. Dengan metode ini, jumlah citra yang dihapus menurun sehingga hasil akhirnya lebih bagus. Berikut ilustrasi proses kedua metode tersebut.
Perbandingan jumlah citra yang dihapus pada kedua metode dapat dilihat pada tabel berikut. Terdapat 5 set citra yang akan disambungkan, dapat dilihat bahwa metode kedua lebih baik dalam menangani kegagalan penyambungan. Contohnya dapat dilihat pada hasil penyambungan citra T5 berikut ini.
: Perbandingan jumlah citra yang dihapus karena gagal disambungkan
Citra Metode 1 Metode 2
T1 0 0 T2 2 3 T3 6 2 T4 2 3 T5 13 4
Berikut adalah implementasi metode kedua dengan menggunakan shell script.
Program image-stitching
akan dijalankan terus menerus hingga tidak ada lagi pesan kesalahan.
remove_unmatch () {
img_num=$(grep error err.log | sed -E 's/.* ([0-9]+).*/\1/') # get unmatch image number
if [ $img_num = $prev_unmatch ]; then # if same as previous unmatch:
img_num=$((img_num-1)) # select the image before unmatch
else
prev_unmatch=$img_num
fi
img_file=$(ls *.png | head -n $((img_num+1)) | tail -n 1) # get its filename
mv $img_file $img_file.rem # remove it
}
cp /usr/local/etc/config.cfg .
prev_unmatch=1
until image-stitching *.png 2> err.log; do
remove_unmatch
done
http://ppwwyyxx.com/2016/How-to-Write-a-Panorama-Stitcher/
Footnotes
-
Brown M, Lowe DG. 2007. Automatic panoramic image stitching using invariant features. IJCV. 74(1): 59--73. ↩
-
Wu Y. 2019. OpenPano: automatic panorama stitching from scratch. Tersedia pada: https://github.com/ppwwyyxx/OpenPano. ↩