Algoritma MLSB (Modified Least Significant Bit)


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
lena

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.

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *