Skip to content

Instantly share code, notes, and snippets.

@auriza
Last active August 11, 2019 06:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save auriza/1da49ee55fb79cdf2d955666d7d4b407 to your computer and use it in GitHub Desktop.
Save auriza/1da49ee55fb79cdf2d955666d7d4b407 to your computer and use it in GitHub Desktop.
title author date
Penyambungan Otomatis Citra Mikroskop
Auriza Akbar
2019

Penyambungan Otomatis Citra Mikroskop

Algoritme

Untuk menyambungkan beberapa citra, diperlukan algoritme pengolahan citra berikut (Brown dan Lowe 2007)1:

  1. ekstraksi ciri dengan scale-invariant feature transform (SIFT)
  2. estimasi homografi atau transformasi affine dengan random sample consensus (Ransac)
  3. optimisasi sambungan antar-citra dengan bundle adjustment dan blending

Salah satu implementasi algoritme ini adalah OpenPano yang ditulis oleh Wu (2019)2.

Kompilasi OpenPano

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.

Konfigurasi OpenPano

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

Menjalankan OpenPano

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.

Urutan citra terurut secara mengular{width=50%}

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.

Citra masukan T1 sebanyak 44 buah{width=75%}

Citra keluaran T1 mode translasi (1.4 menit){width=75%}

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.

Citra keluaran T1 mode estimasi (9.5 menit){width=75%}

Blending Vertikal

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.

Citra keluaran T1 mode translasi dengan blending vertikal{width=75%}

Kegagalan Penyambungan

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.

Penghapusan citra yang gagal disambungkan dengan metode pertama (kiri) dan kedua (kanan)

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

Citra keluaran T5 dengan metode pertama (kiri) dan kedua (kanan)

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

  1. Brown M, Lowe DG. 2007. Automatic panoramic image stitching using invariant features. IJCV. 74(1): 59--73.

  2. Wu Y. 2019. OpenPano: automatic panorama stitching from scratch. Tersedia pada: https://github.com/ppwwyyxx/OpenPano.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment