01.05.2013 Views

implementasi thresholding citra menggunakan algoritma hybrid ...

implementasi thresholding citra menggunakan algoritma hybrid ...

implementasi thresholding citra menggunakan algoritma hybrid ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

IMPLEMENTASI THRESHOLDING CITRA MENGGUNAKAN<br />

ALGORITMA HYBRID OPTIMAL ESTIMATION<br />

M Hafidh Fauzi 1 , Prof.Ir.Handayani Tjandrasa, M.Sc., Ph.D 2<br />

Jurusan Teknik Informatika, Fakultas Teknologi Informasi<br />

Institut Teknologi Sepuluh Nopember, Surabaya<br />

Email: fauzic16@yahoo.com 1<br />

ABSTRAK<br />

Salah satu metode yang sering digunakan dalam pengolahan <strong>citra</strong> digital atau image processing<br />

adalah <strong>thresholding</strong> <strong>citra</strong>. Thresholding <strong>citra</strong> adalah suatu metode yang digunakan untuk memisahkan antara<br />

obyek dan backgroundnya. Thresholding adalah teknik yang sederhana tapi efektif untuk segmentasi <strong>citra</strong>.<br />

Proses Thresholding sering disebut dengan proses binerisasi. Dalam proses <strong>thresholding</strong> terhadap sebuah <strong>citra</strong>,<br />

hasil yang diperoleh tidak selalu memuaskan dan sesuai dengan keinginan. Hal ini dikarenakan faktor<br />

penghambat seperti pencahayaan yang tidak merata atau <strong>citra</strong> yang kabur yang menyebabkan histogram tidak<br />

bisa dipartisi dengan baik. Banyak metode <strong>thresholding</strong> <strong>citra</strong> yang sudah di kembangkan. Salah satu metode<br />

yang akan akan di <strong>implementasi</strong>kan dalam tugas akhir ini adalah metode <strong>thresholding</strong> <strong>citra</strong> dengan<br />

<strong>menggunakan</strong> <strong>algoritma</strong> <strong>hybrid</strong> optimal estimation. Algoritma ini adalah gabungan dari PSO(particle swam<br />

optimization) yang digunakan untuk globak search, dengan EM(expectation maximization) yang digunakan<br />

untuk mengupdate particle terbaik. Dalam <strong>algoritma</strong> ini estimasi parameter dimasukan ke proses EM yang<br />

diperoleh dari pencarian global melalui PSO untuk mendapatkan titik awal yang cocok untuk EM dan sesuai<br />

dengan GMM. Dalam tugas akhir ini juga akan dilakukan pembandingan antara metode yang dipakai dalam<br />

tugas akhir ini dengan metode <strong>thresholding</strong> <strong>citra</strong> yang lain.<br />

Kata kunci : Thresholding <strong>citra</strong>, <strong>hybrid</strong> optimal estimation, PSO, EM<br />

1. Pendahuluan<br />

Salah satu metode yang sering digunakan<br />

dalam pengolahan <strong>citra</strong> digital atau image<br />

processing adalah <strong>thresholding</strong> <strong>citra</strong>. Thresholding<br />

<strong>citra</strong> adalah suatu metode yang digunakan untuk<br />

memisahkan antara obyek dan backgroundnya.<br />

Thresholding merupakan teknik yang sederhana<br />

dan efektif untuk segmentasi <strong>citra</strong>. Proses<br />

<strong>thresholding</strong> sering disebut dengan proses<br />

binerisasi. Pada beberapa aplikasi pengolahan <strong>citra</strong>,<br />

terlebih dahulu dilakukan threshold terhadap <strong>citra</strong><br />

gray level untuk dapat menjadi <strong>citra</strong> biner (<strong>citra</strong><br />

yang memiliki nilai level keabuan 0 atau 255).<br />

Sebuah <strong>citra</strong> hasil proses <strong>thresholding</strong> dapat<br />

disajikan dalam histogram <strong>citra</strong> untuk mengetahui<br />

penyebaran nilai-nilai intensitas piksel pada suatu<br />

<strong>citra</strong>/bagian tertentu dalam <strong>citra</strong> sehingga untuk<br />

<strong>citra</strong> bimodal, histogram dapat dipartisi dengan baik<br />

(segmentasi objek dengan background) dan dapat<br />

ditentukan nilai threshold-nya.<br />

Distribusi gray level tiap kelas mempunyai<br />

PDF(probabilistic density function) yang<br />

diasumsikan sebagai GMM. Dengan <strong>menggunakan</strong><br />

<strong>algoritma</strong> Hybrid optimal estimation ini yang<br />

merupakan gabungan dari PSO dan EM <strong>algoritma</strong>.<br />

Algoritma ini digunakan untuk menyelesaikan funsi<br />

dari estimasi parameter dari distribusi gaussian.<br />

Algoritma ini digunakan untuk mendapatkan kurva<br />

GMM yang sesuai sehingga membuat proses<br />

<strong>thresholding</strong> <strong>citra</strong> menjadi lebih efektif.<br />

Shu-Kai S dan Yen Lin mengembangkan<br />

suatu <strong>algoritma</strong> baru dalam <strong>thresholding</strong> <strong>citra</strong>.<br />

Algoritma ini dapat melakukan <strong>thresholding</strong><br />

terhdapa <strong>citra</strong> dengan beberapa level. Hal ini<br />

sangant menguntungkan apabila <strong>citra</strong> yang akan<br />

dilakukan <strong>thresholding</strong> itu merupakan <strong>citra</strong> yang<br />

komplek.<br />

Paper ini akan dibagi dalam beberapa<br />

bagian. Bagian 2-6 adalah bagian dari <strong>algoritma</strong><br />

yang akan digunakan dalam melakukan<br />

<strong>thresholding</strong> <strong>citra</strong>, bagian 7 adalah ujicoba terhadap<br />

<strong>algoritma</strong> yang sudah di <strong>implementasi</strong>kan, sedang<br />

kan bagian terakhir adalah kesimpulan.<br />

2. Minimum Error Thresholding<br />

Minimum error <strong>thresholding</strong> adalah salah<br />

satu teknik yang dapat digunakan untuk<br />

mendapatkan nilai threshold suatu image. Nilai<br />

pixel image yang mempunyai rentang interval<br />

antara [0,n], dicari distribusi tiap gray level. Dari<br />

distribusi nilai tersebut akan membentuk suatu<br />

histrogram yang nantinya akan digunakan untuk<br />

mencari nilai dari threshold suatu image.<br />

Minimum error <strong>thresholding</strong> ini<br />

membutuhkan nilai dari estimasi parameter yang<br />

berupa P (k+1) ,µ (k+1) ,dan σ (k+1) dari masing-masing<br />

level/kelas yang sudah diestimasi. Nilai-nilai<br />

terebut akan diproses untuk mendapatkan suatu<br />

threshold dari suatu image. Dimana threshold itu<br />

membari suatu batas antara background dengan<br />

objeknya. Persamaan minimum error threshold<br />

sebagai berikut:


3. Expectation Maximation<br />

Algoritma EM merupakan sebuah metode<br />

optimisasi iteratif untuk estimasi Maksimum<br />

Likelihood (ML) yang berguna dalam<br />

permasalahan data yang tidak lengkap (incomplete<br />

data). Dalam setiap iterasi pada Algoritma EM ini<br />

terdapat 2 tahap, yaitu tahap Ekspektasi atau tahap<br />

E (E step) dan tahap Maksimisasi atau tahap M (M<br />

step). Algoritma EM ini hampir mirip dengan<br />

pendekatan ad hoc untuk proses estimasi dengan<br />

missing data yaitu (1) mengganti missing value<br />

dengan estimated value, (2) mengestimasi<br />

parameter, (3) mengestimasi ulang missing value<br />

tadi dengan <strong>menggunakan</strong> parameter baru yang<br />

diestimasi, (4) mengestimasi ulang parameter, dan<br />

seterusnya berulang-ulang sampai dengan<br />

konvergen terhadap suatu nilai.<br />

Pada tahap E-step dimulai dengan<br />

inisialisasi nilai-nilai dari P (k) ,µ (k) ,σ (k) yang nantinya<br />

akan di lakukan update terus menerus hingga<br />

nilainya konvergen. Ketiga parameter tersebut di<br />

perlukan untuk mencari nilai dari probabilitas dari<br />

gaussian mixture model. Probabilitas tersebut dicari<br />

dengan <strong>menggunakan</strong> persamaan sebagai berikut:<br />

Sedangkan untuk M-step sendiri adalah<br />

proses untuk mengoptimalisasi nilai-nilai dari<br />

P (k+1) ,µ (k+1) ,dan σ (k+1) . Nilai-nilai tersebut terus di<br />

update sampai menghasilkan nilai yang<br />

konvergen.persamaan untuk mengupdate nilai<br />

P (k+1) ,µ (k+1) ,dan σ (k+1) di setiap iterasi adalah sebagai<br />

berkut:<br />

Tahap E-step dan M-step ini terus<br />

dilakuakn sampai mendapatkan nilai likelihood<br />

yang maksimal. Persamaan likelihood bisa dilihat<br />

pada persamaan 2.7<br />

4. Hybrid Particle Swarm Optimization<br />

Algoritma Particle Swarm Optimization<br />

(PSO) diperkenalkan oleh Kennedy dan Eberhart<br />

pada tahun 1995, proses <strong>algoritma</strong>nya diinspirasi<br />

oleh perilaku sosial dari binatang, seperti<br />

sekumpulan burung dalam suatu swarm.<br />

Particle Swarm Optimization (PSO)<br />

mempunyai kesamaan dengan genetic algorithm<br />

yang mana dimulai dengan suatu populasi yang<br />

random dalam bentuk matriks. Namun PSO tidak<br />

memiliki operator evolusi yaitu crossover dan<br />

mutasi seperti yang ada pada genetic algorithm.<br />

Baris pada matriks disebut particle atau dalam<br />

genetic algorithm sebagai kromosom yang terdiri<br />

dari nilai suatu variable. Setiap particle berpindah<br />

dari posisinya semula ke posisi yang lebih baik<br />

dengan suatu velocity<br />

Seperti halnya dengan <strong>algoritma</strong><br />

evolusioner yang lain, <strong>algoritma</strong> PSO adalah<br />

sebuah populasi yang didasarkan penelusuran<br />

inisialisasi particle secara random dan adanya<br />

interaksi diantara particle dalam populasi. Di dalam<br />

PSO setiap particle bergerak melalui ruang solusi<br />

dan mempunyai kemampuan untuk mengingat<br />

posisi terbaik sebelumnya dan dapat bertahan dari<br />

generasi ke generasi. Secara umum persamaan PSO<br />

sebagai berikut:<br />

Dimana r adalah nilai random antara(0-1), w adalah<br />

inertia weight dan C adalah nilai konstan untuk<br />

koefisien akselerasi<br />

5. Hamming Distance<br />

Hamming distance adalah suatu metode untuk<br />

mengukur tingkat error antara histogram <strong>citra</strong><br />

dengan probabilistic distribusi function diaman<br />

parameter dari PDF tersebut diperoleh dengan<br />

estimasi parameter.<br />

6. Algoritma PSO+EM<br />

Algoritma PSO+EM adalah dua metode<br />

pencarian yang digabungkan. Dimana tujuan dari<br />

penggabungan dari kedua metode ini adalah saling<br />

menutupi kelemahan dari masing-masing <strong>algoritma</strong>.<br />

EM lemah dalam penentuan nilai awal (inisialisasi<br />

estimasi parameter). Nilai awal yang buruk


menyebabkan terjadinya local maksimal sehingga<br />

nilai estimasi parameter menjadi tidak maksimal<br />

Sedangkan untuk PSO sendiri adalah<br />

pencarian global, pencarian yang berbasis pada<br />

populasi, sama seperti GA tapi membutuhkan<br />

komputasi yang lebih dibandingkan <strong>algoritma</strong><br />

pencarian yang lain.<br />

Algoritma PSO+EM dimulai dengan<br />

menetukan inisialisasi untuk ukuran populasi<br />

dimana ditentukan dengan persamaan 3N+1.<br />

Dimana N adalah dimensi dari problem yang akan<br />

dicari. Sedangkan untuk nilai N dapat dicari dengan<br />

persamaan N=3d-1. Dimana d adalah jumlah kelas.<br />

Particle sebanyak 3N+1 diurutkan berdasarkan<br />

fungsi fitnes untuk mendapatkan nilai yang paling<br />

baik. Fungsi fitnes disini adalah hamming distance.<br />

Nilai terbaik dari parameter akan dimasukan ke<br />

dalam fungsi EM untuk diupdate. Sedangkan untuk<br />

untuk sisa dari particle yang lain digunakan untuk<br />

mengupdate velocity. Nilai velocity ini untuk<br />

selanjutnya digunakan untuk mengupdate lokasi<br />

dari particle untuk masuk ke iterasi selanjutnya.<br />

Itarasi berhenti sampai memenuhi kondisi dimana<br />

nilai EM konvergen. Dalam hal ini perubahan nilai<br />

likelihhod kurang dari 10 -6 .<br />

Initialisasi populasi berukuran 3N+1<br />

ulangi<br />

1) Evaluasi & meranking seluruh particle. Dari<br />

populasi pilih global best dan catat<br />

lokasinya(parameternya).<br />

2) Lakukan EM update untuk global best dan replace<br />

nilainya dengan nilai yang sudah di update<br />

3) PSO update. Lakukan velocity update untuk 3N<br />

particle<br />

Berakhir sampai kondisi terpenuhi (<strong>algoritma</strong> EM<br />

konvergen)<br />

Gambar 1 procedur <strong>algoritma</strong> PSO+EM<br />

Update velocity<br />

untuk particle<br />

yang lain (3N)<br />

7. Uji Coba<br />

mulai<br />

membuat<br />

populasi sebanyak<br />

3N+1particle<br />

Evaluasi nilai<br />

fitnes tiap particle<br />

Meranking<br />

partikel<br />

berdasarkan nilai<br />

fitnes<br />

Menerapkan EM<br />

untuk<br />

mengupdate nilai<br />

particle terbaik<br />

Apakah update<br />

sukses<br />

ya<br />

Menghitung nilai<br />

likelihood untuk<br />

nilai yang diupdate<br />

tidak<br />

tidak<br />

Apakah likelihood<br />

konvergen?<br />

ya<br />

Memperoleh hasil<br />

yang maksimal<br />

selesai<br />

Fungsi<br />

fitnes<br />

Gambar 2 <strong>algoritma</strong> PSO+EM<br />

membuat solusi<br />

baru secara<br />

random<br />

Dalam uji kali ini, akan dilakukan proses<br />

<strong>thresholding</strong> terhadap suatu <strong>citra</strong> dengan<br />

<strong>menggunakan</strong> <strong>algoritma</strong> yang sudah dijelaskan<br />

diatas. Algoritma untuk <strong>thresholding</strong> ini di<br />

<strong>implementasi</strong>kan <strong>menggunakan</strong> matlab dengan<br />

spesifikasi computer yang digunakan adalah<br />

Intel(R) Pentium(R) 4 CPU 2.00GHz, dengan<br />

alokasi memory sebesar 3012 MB. Citra yang<br />

digunakan disini adalah <strong>citra</strong> gray dengan ukuran<br />

256x256 pixel. Algoritma PSO+EM akan berhenti<br />

kalau perubahan nilai dari likelihood kurang dari<br />

10 -6 .


Pada uji coba yang pertama ini dilakukan<br />

<strong>thresholding</strong> terhadap data <strong>citra</strong> rice.png. dimana<br />

jumlah levelnya adalah 4 dan 7.<br />

1. rice.png<br />

Hamming<br />

distance<br />

3,06 10 -4<br />

threshold 72,83,146<br />

Cpu Time 0.75<br />

Hasil<br />

<strong>thresholding</strong><br />

Grafik<br />

histogram<br />

Hamming<br />

9.0572e-005<br />

distance<br />

threshold 39 49 91 106 123 140<br />

Cpu Time 13.0938<br />

Hasil<br />

<strong>thresholding</strong><br />

Grafik<br />

histogram<br />

Tabel 1 uji coba pada rice.png<br />

Pada hasil ujicoba diatas dapat dilihat<br />

bahwa hasil <strong>thresholding</strong> <strong>citra</strong> <strong>menggunakan</strong><br />

beberapa level yang berbeda. Nilai dari cpu time<br />

berbanding lurus dengan nilai penambahan kelas.<br />

Tetapi hal tersebut berbeda dengan nilai hamming<br />

distance yang semakin kecil bila jumlah kelas<br />

semakin besar.<br />

Pada uji coba kedua ini kita akan<br />

melakukan <strong>thresholding</strong> <strong>citra</strong> pada <strong>citra</strong> babon.png,<br />

dimana jumlah kelas sama yaitu 4 dan 7<br />

2. babon.png<br />

Hamming<br />

distance<br />

6.5319e-005<br />

threshold 85 119 152<br />

Cpu Time 1.6563<br />

Hasil<br />

<strong>thresholding</strong>


Grafik histogram<br />

Hamming<br />

1.9162e-005<br />

distance<br />

threshold 64 77 92 107 129<br />

154<br />

Cpu Time 24.0625<br />

Hasil<br />

<strong>thresholding</strong><br />

Grafik histogram<br />

Tabel 2 uji coba pada babon.png<br />

Pada hasil ujicoba kedua ini sama dengan<br />

uji coba pertama. Dapat dilihat bahwa hasil<br />

<strong>thresholding</strong> <strong>citra</strong> <strong>menggunakan</strong> beberapa level<br />

yang berbeda. Nilai dari cpu time berbanding lurus<br />

dengan nilai penambahan kelas. Tetapi hal tersebut<br />

berbeda dengan nilai hamming distance yang<br />

semakin kecil bila jumlah kelas semakin besar.<br />

Pada uji coba ketiga ini kita akan<br />

melakukan <strong>thresholding</strong> <strong>citra</strong> pada <strong>citra</strong><br />

cameraman.tif , dimana jumlah kelas sama yaitu 4<br />

dan 7<br />

3. camera<br />

man.tif<br />

Hamming<br />

distance<br />

4.1490e-004<br />

threshold 49 91 140<br />

Cpu Time 1.5156<br />

Hasil<br />

<strong>thresholding</strong><br />

Grafik<br />

histogram<br />

gambar hasil threshold<br />

Hamming<br />

2.5233e-004<br />

distance<br />

threshold 43 55 106 110 122 136<br />

Cpu Time 8.0625<br />

Hasil<br />

<strong>thresholding</strong>


Grafik<br />

histogram<br />

Tabel 3 uji coba pada cameraman.tif<br />

Pada hasil ujicoba ketiga ini sama dengan<br />

uji coba pertama dan kedua. Dapat dilihat bahwa<br />

hasil <strong>thresholding</strong> <strong>citra</strong> <strong>menggunakan</strong> beberapa<br />

level yang berbeda. Nilai dari cpu time berbanding<br />

lurus dengan nilai penambahan kelas. Tetapi hal<br />

tersebut berbeda dengan nilai hamming distance<br />

yang semakin kecil bila jumlah kelas semakin<br />

besar.<br />

Pada ujicoba yang terakhir ini adalah<br />

ujicoba tentang hubungan antara nilai inertia weight<br />

terhadap hamming distance.<br />

Citra inputan Inertia Hamming<br />

weight distance<br />

Rice.png 0.1 3.4377e-004<br />

0.2 3.0662e-004<br />

0.3 3.7435e-004<br />

0.4 3.0657e-004<br />

0.5 3.7411e-004<br />

0.6 3.0636e-004<br />

0.7 3.0544e-004<br />

0.8 3.3462e-004<br />

0.9 3.0424e-004<br />

Fruit.png 0.1 3.4376e-004<br />

0.2 3.3823e-004<br />

0.3 3.4046e-004<br />

0.4 3.4035e-004<br />

0.5 2.4110e-004<br />

0.6 2.0792e-004<br />

0.7 2.4556e-004<br />

0.8 2.4221e-004<br />

0.9 2.1496e-004<br />

Lena.jpg 0.1 1.7577e-004<br />

0.2 1.7542e-004<br />

0.3 1.7599e-004<br />

0.4 1.7571e-004<br />

0.5 1.7543e-004<br />

0.6 1.7575e-004<br />

0.7 1.7551e-004<br />

0.8 1.7544e-004<br />

0.9 1.7557e-004<br />

Kubus.bmp 0.1 6.2871e-004<br />

0.2 6.2869e-004<br />

0.3 6.2866e-004<br />

0.4 6.2872e-004<br />

0.5 6.2867e-004<br />

0.6 6.2864e-004<br />

0.7 6.2869e-004<br />

0.8 6.2865e-004<br />

0.9 6.2865e-004<br />

Babon.png 0.1 7.0716e-005<br />

0.2 2.4934e-005<br />

0.3 2.9483e-005<br />

0.4 2.4802e-005<br />

0.5 4.5060e-005<br />

0.6 2.9570e-005<br />

0.7 2.9899e-005<br />

0.8 2.4950e-005<br />

0.9 2.2360e-005<br />

Cameraman.tif 0.1 4.1559e-004<br />

0.2 5.6097e-004<br />

0.3 4.1852e-004<br />

0.4 4.2343e-004<br />

0.5 5.5668e-004<br />

0.6 4.1858e-004<br />

0.7 4.1500e-004<br />

0.8 4.2404e-004<br />

0.9 4.2370e-004<br />

Tabel 4 uji coba terhadap inertia weight<br />

Dalam ujicoba tersebut dapat dilihat<br />

bahwa nilai hamming distance akan berada pada<br />

nilai yang stabil bila nilai dari inertia weight yang<br />

besar.<br />

8. Kesimpulan<br />

Berdasarkan aplikasi yang telah dibuat beserta<br />

ujicoba yang telah dilakukan, maka dapat ditarik<br />

kesimpulan sebagai berikut. Nilai dari running time<br />

<strong>algoritma</strong> <strong>thresholding</strong> <strong>citra</strong> <strong>menggunakan</strong><br />

PSO+EM berbanding lurus dengan jumlah kelas<br />

atau level dari tingkat <strong>thresholding</strong>. Hal itu<br />

berbanding terbalik dengan nilai dari hamming<br />

distance. Semakin besar level maka nilai hamming<br />

distance semakin kecil.<br />

Sedangkan untuk nilai inertia weight disini juga<br />

mempengaruhi dari hamming distance. Dimana<br />

inertia weight yang besar lebih bagus dibandingkan<br />

nilai inertia weight yang kecil.


Daftar Pustaka<br />

[1] Zahara,E.,Fan,S.-K.S.,Tsai,D.-M.,2005.<br />

Optimal multi-<strong>thresholding</strong> using a <strong>hybrid</strong><br />

optimization approach .Pattern Recognition<br />

Lett.26,1082–1095<br />

[2] Kittler, J.,Illingworth,J.,1986.Minimum error<br />

<strong>thresholding</strong>. Patten Recognition Lett.19,41–<br />

47.<br />

[3] Shu-Kai S and Yen Lin, 2007. “A multilevel<br />

<strong>thresholding</strong> approach using a <strong>hybrid</strong><br />

optimal estimation algorithm”. Pattern<br />

Recognition Latters., vol. 28, pp. 662-669<br />

[4] Gonzales, R. C., & Woods, R. E. 2002.<br />

Digital Image Processing. New Jersey:<br />

Prentice-Hall.<br />

[5] Jiulun, fan., Winxin Xie, 1997. Minimum<br />

error <strong>thresholding</strong>: A note. Pattern<br />

Recognition Letters 18 (1997) 705-709<br />

[6] Tuegeh, Maickel., Soeprijanto., H, Purnomo,<br />

Mauridhi.2009. Modified Improved Particle<br />

Swarm Optimization For Optimal Generator<br />

Scheduling. Seminar Nasional Aplikasi<br />

Teknologi Informasi 2009 (SNATI 2009)<br />

[7] Shu-Kai S and Yen Lin, 2007. A fast<br />

estimation method for the generalized<br />

Gaussian mixture distribution On complex<br />

images.ComputerVision and Image<br />

Understanding 113 (2009) 839–853<br />

[8] Shu-Kai S and Yen Lin. 2008. Image<br />

<strong>thresholding</strong> using a novel estimation<br />

method in generalized Gaussian distribution<br />

mixture modeling. Neurocomputing 72<br />

(2008) 500–512<br />

[9] hu, Xiaohui. 2006. Particle Swarm<br />

Optimization, .<br />

[10]Grayscale,.<br />

[11] Statistika komputasi, 2010. <strong>algoritma</strong> EM. ,<<br />

http://statistikakomputasi.wordpress.com/20<br />

10/04/08/analisis-missing-data<strong>menggunakan</strong>-<strong>algoritma</strong>-em-2/,<br />

diakses 18<br />

Juni 2010>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!