Algoritma MLSB (Modified Least Significant Bit) adalah salah satu algoritma yang dapat digunakan untuk melakukan kompresi sinyal ataupun gambar. Contoh yang dibahas kali ini adalah mengenai pengolahan file gambar.
Sesuai namanya, algoritma ini merupakan modifikasi dari LSB (Least Significant Bit). Nilai bit tidak secara langsung disisipkan dalam citra, melainkan diolah terlebih dahulu menggunakan teknik tertentu sehingga data yang disisipkan dapat dikompres dan membutuhkan tempat yang lebih sedikit dibandingkan teknik algoritma sebelumnya.
Diketahui data awal adalah sebagai berikut. Dalam kasus ini akan digunakan gambar berwarna bertipe jpg dengan ukuran 128 x 128 pixel
Perlu diingat bahwa ukuran lebar dan panjang yang direkomendasikan adalah kelipatan 2, dan ukuran gambar adalah persegi (ukuran lebar = ukuran panjang)
Jika ukuran gambar tidak persegi, maka gambar tersebut harus dikonversi agar menjadi ukuran persegi
Ada 2 cara untuk melakukan hal tersebut
- Gambar tersebut diskala ulang
- Dilakukan penambahan pixel warna hitam disekeliling gambar tersebut
Langkah-langkah penggunaan algoritma ini adalah
1. Lakukan penyimpanan semua data warna dalam pixel yang terdapat dalam gambar tersebut
warna dalam sebuah pixel dibedakan menjadi 3 bagian, yaitu komponen merah, hijau, dan biru
For i = 0 To gmb.Width - 1 For j = 0 To gmb.Height - 1 inputPixel(i)(j)(0) = gmb.GetPixel(i, j).R inputPixel(i)(j)(1) = gmb.GetPixel(i, j).G inputPixel(i)(j)(2) = gmb.GetPixel(i, j).B Next j Next i
* Implementasi tahap penyisipan bit adalah sebagai berikut
2a. Lakukan pengambilan nilai ascii dari masing-masing karakter pesan
Dim byteTeks() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(txtPesan.Text)
2b. Susun semua nilai karakter menjadi sebuah string panjang, dipisahkan dengan karakter spasi
Sebagai contoh apabila nilai ascii karakter pertama adalah 90 dan nilai ascii karakter kedua adalah 100
maka hasil konversi adalah “90 100”
Dim stringByteTeks As String = "" For i As Integer = 0 To byteTeks.Length - 1 stringByteTeks &= IIf(stringByteTeks <> "", " ", "") & byteTeks(i).ToString Next
2c. Dapatkan kembali nilai dari masing-masing karakter dalam string tersebut dan lakukan konversi menjadi nilai 5 bit
Sebagai contoh,
untuk karakter 1 maka hasil konversi adalah 00001
untuk karakter 6 maka hasil konversi adalah 00110
untuk karakter spasi maka hasil konversi adalah 11101
Dim daftarKarakter(stringByteTeks.Length + 1) As Byte For i As Integer = 0 To stringByteTeks.Length - 1 If stringByteTeks(i) = " " Then daftarKarakter(i + 1) = Convert.ToInt32("1D", 16) Else daftarKarakter(i + 1) = Convert.ToByte(stringByteTeks(i)) - Convert.ToInt32("30", 16) End If Next
2d. Kemudian tambahkan karakter awal dan karakter akhir pada daftar karakter
sebagai alat untuk mendeteksi jumlah karakter pada saat proses ekstraksi nantinya
pada deret karakter tersebut akan ditambahkan nilai 11110 sebagai karakter awal dan 11111 sebagai karakter akhir
daftarKarakter(0) = Convert.ToInt32("1E", 16) daftarKarakter(daftarKarakter.Length - 1) = Convert.ToInt32("1F", 16) Dim idxKarakter As Integer = 0
2e. Lakukan penyisipan masing masing deret karakter ke dalam 5 bit dari masing-masing nilai pixel
Jika sudah tidak ada karakter yang disisipkan, maka hentikan perhitungan
For x As Integer = 0 To outputPixel.Length - 1 For y As Integer = 0 To outputPixel(x).Length - 1 For z As Integer = 0 To outputPixel(x)(y).Length - 1 If idxKarakter <= daftarKarakter.Length - 1 Then outputPixel(x)(y)(z) = outputPixel(x)(y)(z) - outputPixel(x)(y)(z) Mod 32 + daftarKarakter(idxKarakter) idxKarakter += 1 Else GoTo Selesai End If Next Next Next
* Implementasi tahap ekstraksi bit adalah sebagai berikut
3a. Lakukan ekstraksi 5 bit dari masing-masing nilai pixel untuk mendapatkan deret karakter yang disisipkan sebelumnya
Jika ditemukan karakter penutup, yaitu 11111, maka hentikan perhitungan
Dim daftarKarakter As New List(Of Byte) For x As Integer = 0 To outputPixel.Length - 1 For y As Integer = 0 To outputPixel(x).Length - 1 For z As Integer = 0 To outputPixel(x)(y).Length - 1 If Not (outputPixel(x)(y)(z) Mod 32 = Convert.ToInt32("1E", 16)) Then If outputPixel(x)(y)(z) Mod 32 = Convert.ToInt32("1F", 16) Then GoTo Selesai daftarKarakter.Add(outputPixel(x)(y)(z) Mod 32) End If Next Next Next
3b. Susun semua deret karakter menjadi sebuah string panjang
Tetapi jika ditemukan nilai binary 11101, maka lakukan konversi nilai binary tersebut menjadi karakter spasi
Sebagai contoh apabila deret karakter tersebut bernilai 1, 2, 3, 29, 1, 4, 5
maka hasil penyusunan string adalah "123 145"
Dim stringByteTeks As String = "" For i As Integer = 0 To daftarKarakter.Count - 1 If daftarKarakter(i) = Convert.ToInt32("1D", 16) Then stringByteTeks &= " " Else stringByteTeks &= daftarKarakter(i).ToString End If Next
3c. Dapatkan nilai byte sebenarnya dengan melakukan pemisahan string dengan menggunakan tanda spasi
Dim byteTeks() As String = stringByteTeks.Split(" ")
3d. Lakukan konversi nilai ascii menjadi karakter pesan rahasia
dan tampilkan hasil pesan rahasia pada layar
Dim hasil As String = "" For i As Integer = 0 To byteTeks.Length - 1 hasil &= Chr(byteTeks(i)) Next txtEkstraksiPesan.Text = hasil
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh source code lengkap dalam bahasa VB (Visual Basic) dapat didownload disini:
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.