• Tidak ada hasil yang ditemukan

BAB IV IMPLEMENTASI

4.2 Implementasi Metode Exact Match

Pada sub bab ini dijelaskan mengenai fungsi-fungsi pada implementasi metode exact match sesuai pada Bab III. Metode exact match langsung diimplementasikan dengan menggunakan penyimpanan blok bebentuk nilai hash mengingat besarnya dataset yang digunakan. Sedangkan hal lainnya sesuai dengan paper referensi.

4.2.1 Konversi Citra Menjadi Grayscale

Proses konversi citra menjadi bentuk grayscale dilakukan pada fungsi utama karena syntax untuk melakukan konversi RGB ke grayscale cukup dengan satu perintah dengan menggunakan OpenCV.

1 grayscale_image = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2GRAY)

Kode Sumber 4.1 Konversi citra RGB ke grayscale Fungsi cvtColor merupakan fungsi untuk melakukan konversi warna pada citra. Fungsi tersebut membutuhkan dua parameter, yaitu image masukan dan keterangan konversi. rgb_image merupakan variabel yang menampung citra dalam bentuk RGB sedangkan COLOR_BGR2GRAY berarti fungsi akan melakukan konversi bentuk RGB ke grayscale.

4.2.2 Implementasi proses pengambilan blok

Proses pengambilan blok dijadikan dalam sebuah fungsi. Data masukan berupa citra dan ukuran blok. Citra masukan dapat berupa citra RGB maupun grayscale. Ukuran blok terdiri dari satu bilangan yang mencerminkan blok NxN.

1 2

def get_blocks(img, block_size):

27 3 4 5 6 7 8 9 10 11 blocks = []

for y in range(0, img_height -

block_size + 1):

for x in range(0, img_width – block_size + 1):

block = img[y: y + block_size, x: x+block_size]

block = block.copy(order='C') block_hash = binascii.crc32(block) block = str(block_hash) + '_' + str(x) + '_' + str(y) blocks.append(block) return blocks

Kode Sumber 4.2 Pengambilan blok exact match Proses pengambilan blok dilakukan dengan cara melakukan pergeseran blok kekanan lalu kebawah sepanjang ukuran citra yang dimulai dari pojok kiri atas. Pada Kode Sumber 4.2 pergeseran blok ditunjukan pada perulangan di baris keempat dan kelima. Setiap pergerseran blok diambil piksel yang berada didalam blok tersebut, disimpan pada variabel block pada baris keenam. Nilai hash dari block dihitung dengan menggunakan algoritma CRC32 pada baris ketujuh. Nilai hash digunakan untuk mempercepat proses perhitungan selanjutanya dan untuk menghemat penggunaan memori. Hash yang didapat lalu dikonversi menjadi string kemudian disambung dengan posisi x dan posisi y dari blok tersebut. Blok disimpan dalam sebuah string yang berisi hash piksel, posisi x, dan posisi y dipisahkan dengan karakter underscore. Penyimpanan dalam bentuk string dapat menghemat penggunaan memori yang berjalan dibandingkan dengan penyimpanan dalam bentuk list ataupun dictionary.

4.2.3 Implementasi Proses Pengurutan

Pengurutan blok dilakukan untuk mempermudah proses pencarian sehingga pencarian blok dapat berjalan lebih cepat. Karena blok bertipe data string, maka pengurutan akan dilakukan berdasarkan urutan karakter mulai dari yang terdepan. Berdasarkan penyimpanan blok pada proses sebelumnya, nilai pertama yang ada pada blok adalah nilai hash. Sehingga blok akan diurutkan berdasaran nilai hash.

1 blocks = sorted(blocks)

Kode Sumber 4.3 Pengurutan blok

Pada Kode Sumber 4.3 pengurutan dilakukan hanya menggunakan satu perintah. Fungsi sorted akan melakukan pengurutan pada sebuah variabel yang dapat diiterasi, seperti list, string, tuple. Secara default pengurutan akan dilakukan secara leksikografi, atau urut abjad.

4.2.4 Implementasi Pencarian Blok

Setelah dilakukan pengurutan, blok akan dilakukan pencarian. Pencarian dilakukan dengan cara mengiterasi blok yang sudah terurut. Apablia ditemui dua blok yang memiliki nilai hash yang sama, posisi dari blok tersebut akan ditandai pada citra hasil pengolahan.

1 2 3 4 5 6 7

def search_and_mark(blocks, result_image, block_size):

marker_image = np.zeros((block_size, block_size, 3), np.uint8) marker_image[:] = [255, 255, 255] for currentIndex, block1 in

enumerate(blocks[:-1]):

block2 = blocks[currentIndex+1] block2 = block2.split('_') block1 = block1.split('_')

29 8 9 10 11 12 13 14 15 if block1[0] == block2[0]: pos_y = int(block1[2]) pos_x = int(block1[1]) result_image[pos_y: pos_y+block_size,

pos_x: pos_x+block_size] = marker_image

pos_y = int(block2[2]) pos_x = int(block2[1]) result_image[pos_y: pos_y+block_size,

pos_x: pos_x+block_size] = marker_image

return result_image

Kode Sumber 4.4 Pencarian blok exact match Pada Kode Sumber 4.4 fungsi search_and_mark memiliki tiga parameter, yaitu blocks list dari kumpulan blok, result_image variabel yang menampung hasil posisi objek copy-move, dan block_size ukuran blok. Pada baris kedua dan ketiga, dibuat sebuah variabel untuk mendandai result_image sesuai dengan ukuran blok. Pada baris keempat, dilakukan iterasi semua blok yang ada. Setiap iterasi, diambil nilai hash dari dua blok yang berurutan pada baris kelima sampai ketujuh. Apabila nilai hash sama, result_image dilakukan penandaan dengan mark_image sesuai dengan posisi blok. Setelah iterasi selesai, fungsi mengembalikan result_image.

4.2.5 Implementasi Penyampaian Hasil

Tahap terakhir dari metode exact match yaitu penyampaian hasil. Terdapat dua keluaran dari metode ini, yang pertama adalah citra yang memiliki latar hitam dan menampilkan objek copy-move, yang kedua adalah citra asal yang ditempelkan garis yang menunjukkan bahwa garis tersebut adalah objek copy-move.

Untuk mendapatkan garis keliling dari citra hasil pengolahan, digunakan fungsi findContours pada library OpenCV. 1 2 3 4 5 6 7 8 9 10 11 12 13

def write_contours(source_img, dest_img): source_img_gray = cv2.cvtColor(source_img, cv2.COLOR_BGR2GRAY) ret, thresh=cv2.threshold(source_img_gray, 127, 255, 0) contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(dest_img, contours, -1, (0, 0, 255), 3) return dest_img

def write_result(result_image, rgb_path): dest_path = 'result\\bw_' + rgb_path.split('\\')[1] cv2.imwrite(dest_path, result_image, [int(cv2.IMWRITE_PNG_COMPRESSION), 0]) rgb_image = cv2.imread(rgb_path) rgb_image = write_contours(result_image, rgb_image) dest_path = 'result\\rgb_' + rgb_path.split('\\')[1] cv2.imwrite(dest_path, rgb_image, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])

Kode Sumber 4.5 Penyampaian hasil

Pada Kode Sumber 4.5 terdapat dua fungsi, write_contour dan write_result. Fungsi write_contour akan mewarnai objek copy-move pada citra RGB berdasarkan citra hitam-putih. Baris kedua dan ketiga melakukan konversi citra ke RGB agar sesuai dengan kebutuhan fungsi findContour. Baris keempat menjalankan fungsi findCountour. Baris kelima

31

menandai citra RGB sesuai kontur yang didapatkan pada fungsi findContour. Fungsi write_result melakukan penyimpanan citra hasil olahan ke dalam komputer.

4.2.6 Implementasi Fungsi Utama

Fungsi utama (main) merangkum tahap-tahap yang dilakukan pada metode exact match. Berikut adalah kode sumber fungsi utama.

1 2 3 4 5 6 7 8 9 rgb_image = cv2.imread(imagePath) grayscale_image = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2GRAY) imageHeight, imageWidth = grayscale_image.shape blocks = get_blocks(grayscale_image, block_size) del grayscale_image blocks = sorted(blocks)

resultImage = np.zeros((imageHeight, imageWidth, 3), np.uint8) resultImage = search_and_mark(blocks, resultImage, block_size) write_result(resultImage, imagePath)

Kode Sumber 4.6 Fungsi utama

Pada Kode Sumber 4.6 baris pertama membaca citra yang telah dilakukan serangan copy-move. Baris kedua melakukan konversi RGB ke grayscale. Baris keempat melakukan pengambilan blok. Baris ke enam melakukan pengurutan blok. Baris kedelapan melakukan pencarian dan penandaan posisi. Baris kesepuluh menyimpan citra hasil ke komputer.

4.3 Implementasi Pengembangan Metode Exact Match

Dokumen terkait