Membuat Panorama dari Gambar Fisheye

Rizqi Okta Ekoputris
Nodeflux
Published in
4 min readApr 4, 2018

Artikel ini akan membahas bagaimana membuat gambar lanskap atau gambar panorama dari gambar hasil kamera fisheye 360 derajat. Namun sebelumnya, apa sih gambar fisheye 360 derajat itu?

[gambar oleh gcardinal]

Gambar fisheye ini diambil dari lensa fisheye pada kamera. dan menggunakan proyeksi stereographic untuk mendapatkan gambar hasil akhir.

Sebenarnya itu seperti mengambil gambar normal seperti biasa namun terdapat proses “pelengkungan”dari atas gambar atau bawah gambar (tetapi proses ini lebih kompleks lagi).

Untuk lebih mudah memahaminya, coba luruskan dan angkat telapak tangan kananmu. Posisikan telapak tangan mengarah kebawah, ibu jari mengarah ke kamu, dan 4 jari lainya mengarah ke kiri. Anggap gambar panorama tersebut menjalar dari ujung jarimu hingga ke jempol. Lalu genggam tanganmu, maka jadilah apa itu gambar fisheye.

Penjelasan Algoritma untuk membuat gambar panorama dari gambar fisheye

Algoritma ini bertujuan untuk mengembalikan gambar fisheye tersebut ke bentuk lanskap kembali. Proses yang digunakan adalah “mendatarkan” gambar fisheye tersebut. Berikut diagram untuk menjelaskan algoritma ini:

Disini dapat dilihat bahwa garis AB akan semakin merapat dan titik tengah O pada gambar fisheye akan semakin merenggang. Proses ini dilakukan untuk semua piksel gambar.

Permasalahan pertama dapat diatasi dengan menggunakan ukuran gambar yang lebih besar. Hal ini tidak masalah besar walaupun terdapat beberapa piksel yang tidak terisi alias putih.

Permasalahan kedua mungkin sedikit susah untuk mendapatkan hasil yang terbaik karena proses yang ada ini seperti menebak piksel yang akan dipetakan ke gambar akhir dari gambar awal. Solusi yang paling sederhana adalah meningkatkan resolusi dari gambar awal. Tapi ini hanya mengurangi, bukan mengatasi masalah.

Piksel dari atas hingga kebawah pada gambar akhir adalah ekuivalen dengan piksel dari pojok hingga titik tengah gambar awal. Atau variable l perlahan berkurang menjadi 0.

Piksel dari kiri hingga ke kanan pada gambar akhir adalah ekuivalen dengan piksel dari 2π radian hingga 0 radian pada gambar awal. Hal ini juga ekuivalen dengan piksel dari 0 radian hingga -2π radian dikarenakan sinus dan cosinus adalah fungsi periodik.

Berikut adalah diagram yang menunjukkan proses pengubahan gambar awal hingga menjadi gambar akhir:

Disini terdapat 2 asumsi untuk menyederhanakan proses-proses untuk membuat code:

  • Gambar awal berbentuk persegi
  • Lebar dari gambar awal bernilai genap

Memang penyederhanaan diatas tidak terlalu penting, namun itu dapat memudahkan pembuatan code. Code ini nantinya menggunakan pemetaan menjadi 4 bagian sesuai kuadran pada diagram Kartesius dikarenakan ini dapat memudahkan proses matematisnya.

Algoritma/code untuk membuat gambar lanskap dari gambar fisheye

Pada code ini terdapat penambahan interpolasi bilinier. Jadi code ini menghasilkan 2 gambar yang berbeda yaitu gambar yang menggunakan interpolasi bilinier dan tanpa menggunakan interpolasi bilinier. Berikut code nya menggunakan bahasa C#:

Sebelumnya, kita lihat dulu gambar fisheye kita sebelumnya.

Berikut hasil gambar lanskap tanpa interpolasi bilinier dari hasil algoritma yang telah dibuat:

[klik untuk melihat gambar lebih besar]

Berikut hasil gambar lanskap menggunakan interpolasi bilinier dari hasil algoritma yang telah dibuat:

[klik untuk melihat gambar lebih besar]

Dan berikut hasil gambar lanskap yang disediakan oleh sumber gambar

[gambar oleh gcardinal]

Berikut penjelasan algoritma diatas menggunakan gambar berikut:

Menghasilkan:

[klik untuk mendapatkan gambar yang lebih besar]

Bisa dilihat pada gambar diatas. Pada gambar akhir, terdapat hasil yang masih melengkung pada bagian bawah. Maka dari itu diperlukan suatu algoritma lagi untuk memperbaiki permasalah tersebut.

Reference

[1] http://polymathprogrammer.com/2009/10/15/convert-360-degree-fisheye-image-to-landscape-mode/

--

--