def encode(img, message): # proses merubah pesan string menjadi bit bitMessage = bo.word2bit(message) # mendapatkan panjang pesan setelah dirubah menjadi bit bitLenght = len(bitMessage) index = 0 # proses mendapatkan jumlah baris dan kolom rows, cols = img.shape[:2] # inisialisasi image baru tempat pesan akan disimpan imgResult = np.zeros((rows, cols, 3), np.uint8) * 255 lastIteration = True # proses menyisipkan pesan ke dalam gambar denganaturan lsb # karena citra berwarna, setiap pixel dapat menampung 3 bit pesan. Setiap bit disimpan dalam chanel R, G, dan B for i in range(rows): for j in range(cols): color = img[i, j] if lastIteration: for pix in range(3): if index < bitLenght: lsbPixel = bo.int2bit(color[pix])[-1] newPixVal = color[pix] + lsbVal( bitMessage[index], lsbPixel) if newPixVal < 0: newPixVal = 1 if newPixVal > 255: newPixVal = 254 imgResult[i, j][pix] = newPixVal index += 1 else: lastIteration = False else: imgResult[i, j] = color # kombinasi nilai val1, val2, val3 akan menyimpan nilai infromasi panjang pesan. # Nilai ini dibutuhkan ketika proses decode val1, val2, val3, val4 = cl.setCharLength(len(message)) # ketiga nilai tersebut akan disimpan pada pixel terakhir imgResult[rows - 1, cols - 1] = [val1, val2, val3] imgResult[rows - 1, cols - 2][0] = val4 return imgResult
def decode(img): # proses mendapatkan resolusi gambar rows, cols = img.shape[:2] # proses mendapatkan nilai panjang pesan. Sehingga proses extraksi akan berhenti ketika semua pesan sudah diextract charLength = cl.getCharLenth(img[rows - 1, cols - 1][0], img[rows - 1, cols - 1][1], img[rows - 1, cols - 1][2], img[rows - 1, cols - 2][0]) # panjang karakter dikalikan dengan 8 karena 1 karakter = 8 bit integer charLength = charLength * 8 index = 0 bit = [] lastIteration = True # proses extraksi pesan dengan cara menelusuri setiap pixel pada gambar # proses menelusuri akan berhenti ketika semua pesan sudah diextract for i in range(rows): j = 0 while j < cols: if lastIteration: for pix in range(3): if index < charLength: gi, gi1 = int(img[i, j][pix]), int(img[i, j + 1][pix]) diff = abs(gi - gi1) ik, n = qTable(diff) b = bo.int2bit(abs(diff - ik)) fixBit = [0 for i in range(n - len(b))] fixBit.extend(b) bit.extend(fixBit) index += n img[i, j][pix] -= diff if img[i, j][pix] < 0: img[i, j][pix] = 0 else: lastIteration = False else: break j += 2 cv2.imwrite('../img/pvd-color/after-decode.png', img) return bo.bit2word(bit)
def decode(img): # konversi gambar ke grayscale img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # proses mendapatkan resolusi gambar rows, cols = img.shape[:2] # proses mendapatkan nilai panjang pesan. Sehingga proses extraksi akan berhenti ketika semua pesan sudah diextract charLength = cl.getCharLenth(img[rows - 1, cols - 1], img[rows - 1, cols - 2], img[rows - 1, cols - 3], img[rows - 1, cols - 4]) # panjang karakter dikalikan dengan 8 karena 1 karakter = 8 bit integer charLength = charLength * 8 index = 0 bit = [] # proses extraksi pesan dengan cara menelusuri setiap pixel pada gambar # proses menelusuri akan berhenti ketika semua pesan sudah diextract for i in range(rows): j = 0 while j < cols: if index < charLength: gi, gi1 = int(img[i, j]), int(img[i, j + 1]) diff = abs(gi - gi1) ik, n = qTable(diff) b = bo.int2bit(int((gi + gi1) % math.pow(2, n))) fixBit = [0 for i in range(n - len(b))] fixBit.extend(b) bit.extend(fixBit) index += n img[i, j] -= diff if img[i, j] < 0: img[i, j] = 0 else: break j += 2 cv2.imwrite('../img/mf-gray/after-decode.png', img) return bo.bit2word(bit)
def encode(img, message): # konversi gambar ke grayscale img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # proses merubah pesan string menjadi bit bitMessage = bo.word2bit(message) # mendapatkan panjang pesan setelah dirubah menjadi bit bitLenght = len(bitMessage) index = 0 # proses mendapatkan jumlah baris dan kolom rows, cols = img.shape[:2] # inisialisasi image baru tempat pesan akan disimpan imgResult = np.zeros((rows, cols,1),np.uint8)*255 # proses menyisipkan pesan ke dalam gambar denganaturan lsb # karena citra grayscale, setiap pixel hanya dapat menampung 1 bit pesan. for i in range(rows): for j in range(cols): color = int(img[i,j]) if index < bitLenght: lsbPixel = bo.int2bit(color)[-1] imgResult[i,j] = color + lsbVal(bitMessage[index], lsbPixel) index += 1 else: imgResult[i,j] = color # kombinasi nilai val1, val2, val3 akan menyimpan nilai infromasi panjang pesan. # Nilai ini dibutuhkan ketika proses decode val1, val2, val3, val4 = cl.setCharLength(len(message)) # ketiga nilai tersebut akan disimpan pada 3 pixel terakhir imgResult[rows-1, cols-1] = val1 imgResult[rows-1, cols-2] = val2 imgResult[rows-1, cols-3] = val3 imgResult[rows-1, cols-4] = val4 return imgResult
def decode(img): # proses mendapatkan resolusi gambar rows, cols = img.shape[:2] # proses mendapatkan nilai panjang pesan. Sehingga proses extraksi akan berhenti ketika semua pesan sudah diextract charLength = cl.getCharLenth(img[rows - 1, cols - 1][0], img[rows - 1, cols - 1][1], img[rows - 1, cols - 1][2], img[rows - 1, cols - 2][0]) # panjang karakter dikalikan dengan 8 karena 1 karakter = 8 bit integer charLength = charLength * 8 index = 0 bit = [] lastIteration = True toogle = True # proses extraksi pesan dengan cara menelusuri setiap pixel pada gambar # proses menelusuri akan berhenti ketika semua pesan sudah diextract for i in range(rows): for j in range(cols): if lastIteration: for pix in range(3): if index < charLength: if int(img[i, j][pix]) % 2 == 0: bit.append('0') img[i, j][pix] += 1 else: bit.append('1') img[i, j][pix] -= 1 index += 1 if img[i, j][pix] < 0: img[i, j][pix] = 0 if img[i, j][pix] > 255: img[i, j][pix] = 255 else: lastIteration = False else: break cv2.imwrite('../img/lsb-color/after-decode.png', img) return bo.bit2word(bit)
def decode(img): # konversi gambar ke grayscale img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # proses mendapatkan resolusi gambar rows, cols = img.shape[:2] # proses mendapatkan nilai panjang pesan. Sehingga proses extraksi akan berhenti ketika semua pesan sudah diextract charLength = cl.getCharLenth(img[rows-1, cols-1], img[rows-1, cols-2], img[rows-1, cols-3], img[rows-1, cols-4]) # panjang karakter dikalikan dengan 8 karena 1 karakter = 8 bit integer charLength = charLength * 8 index = 0 bit = [] # proses extraksi pesan dengan cara menelusuri setiap pixel pada gambar # proses menelusuri akan berhenti ketika semua pesan sudah diextract for i in range(rows): for j in range(cols): if index < charLength: if int(img[i,j]) % 2 == 0: bit.append('0') img[i,j] += 1 else: bit.append('1') img[i,j] -= 1 index += 1 if img[i,j] < 0: img[i,j] = 0 if img[i,j] > 255: img[i,j] = 255 else: break cv2.imwrite('../img/lsb-gray/after-decode.png',img) return bo.bit2word(bit)
def encode(img, message): # konversi gambar ke grayscale img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # proses merubah pesan string menjadi bit bitMessage = bo.word2bit(message) # mendapatkan panjang pesan setelah dirubah menjadi bit bitLenght = len(bitMessage) index = 0 # proses mendapatkan jumlah baris dan kolom rows, cols = img.shape[:2] if rows % 2 == 1:rows += 1 if cols % 2 == 1:cols += 1 img = cv2.resize(img, (cols, rows)) # inisialisasi image baru tempat pesan akan disimpan imgResult = np.zeros((rows, cols,1),np.uint8)*255 lastIteration = True isFinish = True # proses menyisipkan pesan ke dalam gambar dengan aturan pixel value differencing # karena citra grayscale, setiap pixel dapat menampung minimal 1 bit pesan. Setiap bit disisipkan dalam setiap pixel for i in range(rows): j = 0 while j < cols: color = int(img[i,j]) if lastIteration: gi, gi1 = int(img[i,j]), int(img[i,j+1]) diff = gi1 - gi ik, n = qTable(abs(diff)) restBit = len(bitMessage) if restBit <= n: bitMessage.extend([0 for i in range(n - restBit)]) lastIteration = False bit = bitMessage[:n] del bitMessage[:n] b = bo.bit2int(bit) diffA = 0 if diff >= 0: diffA = ik + b else: diffA = -1 * (ik + b) m = abs(diffA - abs(diff)) if m % 2 == 0: gi -= int(m/2) gi1 += int(m/2) while abs(gi - gi1) != b: if gi < gi1: gi += 1 else: gi1 += 1 else: gi -= math.ceil(m/2) gi1 += math.floor(m/2) while abs(gi - gi1) != b: if gi < gi1: gi += 1 else: gi1 += 1 if gi < 0: gi1 -= gi gi = 0 if gi1 > 255: gi -= gi1 - 255 gi1 = 255 imgResult[i,j] = gi imgResult[i,j+1] = gi1 j += 2 else: imgResult[i,j] = color j += 1 # kombinasi nilai val1, val2, val3 akan menyimpan nilai infromasi panjang pesan. # Nilai ini dibutuhkan ketika proses decode val1, val2, val3, val4 = cl.setCharLength(len(message)) # ketiga nilai tersebut akan disimpan pada 3 pixel terakhir imgResult[rows-1, cols-1] = val1 imgResult[rows-1, cols-2] = val2 imgResult[rows-1, cols-3] = val3 imgResult[rows-1, cols-4] = val4 return imgResult
def encode(img, message, isColor): # konversi gambar ke grayscale if isColor: img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # proses merubah pesan string menjadi bit bitMessage = bo.word2bit(message) # mendapatkan panjang pesan setelah dirubah menjadi bit bitLenght = len(bitMessage) index = 0 # proses mendapatkan jumlah baris dan kolom rows, cols = img.shape[:2] if rows % 2 == 1: rows += 1 if cols % 2 == 1: cols += 1 img = cv2.resize(img, (cols, rows)) # inisialisasi image baru tempat pesan akan disimpan imgResult = np.zeros((rows, cols, 1), np.uint8) * 255 lastIteration = True # proses menyisipkan pesan ke dalam gambar dengan aturan modulus function # karena citra grayscale, setiap pixel dapat menampung minimal 1 bit pesan. Setiap bit disisipkan dalam setiap pixel for i in range(rows): j = 0 while j < cols: color = int(img[i, j]) if lastIteration: gi, gi1 = int(img[i, j]), int(img[i, j + 1]) diff = abs(gi - gi1) ik, n = qTable(abs(diff)) restBit = len(bitMessage) if restBit <= n: bitMessage.extend([0 for i in range(n - restBit)]) lastIteration = False bit = bitMessage[:n] del bitMessage[:n] b = bo.bit2int(bit) r = (gi + gi1) % math.pow(2, n) m = abs(r - b) m1 = abs(math.pow(2, n) - m) if (r > b) and (m <= math.pow(2, n) / 2) and (gi >= gi1): gi -= math.ceil(m / 2) gi1 -= math.floor(m / 2) elif (r > b) and (m <= math.pow(2, n) / 2) and (gi < gi1): gi -= math.ceil(m / 2) gi1 -= math.floor(m / 2) elif (r > b) and (m > math.pow(2, n) / 2) and (gi >= gi1): gi += math.ceil(m1 / 2) gi1 += math.floor(m1 / 2) elif (r > b) and (m > math.pow(2, n) / 2) and (gi < gi1): gi += math.ceil(m1 / 2) gi1 += math.floor(m1 / 2) elif (r <= b) and (m <= math.pow(2, n) / 2) and (gi >= gi1): gi += math.ceil(m / 2) gi1 += math.floor(m / 2) elif (r <= b) and (m <= math.pow(2, n) / 2) and (gi < gi1): gi += math.ceil(m / 2) gi1 += math.floor(m / 2) elif (r <= b) and (m > math.pow(2, n) / 2) and (gi >= gi1): gi -= math.ceil(m1 / 2) gi1 -= math.floor(m1 / 2) elif (r <= b) and (m > math.pow(2, n) / 2) and (gi < gi1): gi -= math.ceil(m1 / 2) gi1 -= math.floor(m1 / 2) po1 = img[i, j] po2 = img[i, j + 1] if (po1 == 0 or po2 == 0) and (gi < 0 or gi1 < 0): gi += math.pow(2, n) gi1 += math.pow(2, n) img[i, j] = gi img[i, j + 1] = gi1 elif (po1 == 255 or po2 == 255) and (gi > 255 or gi1 > 255): gi -= math.pow(2, n) gi1 -= math.pow(2, n) img[i, j] = gi img[i, j + 1] = gi1 elif diff > 128: if gi < 0 and gi1 >= 0: img[i, j] = 0 img[i, j + 1] = gi + gi1 elif gi >= 0 and gi1 < 0: img[i, j] = gi + gi1 img[i, j + 1] = 0 elif gi > 255 and gi1 >= 0: img[i, j] = 255 img[i, j + 1] = gi1 + (gi - 255) elif gi >= 0 and gi1 > 255: img[i, j] = gi + (gi1 - 255) img[i, j + 1] = 255 else: imgResult[i, j] = gi imgResult[i, j + 1] = gi1 j += 2 else: imgResult[i, j] = color j += 1 # kombinasi nilai val1, val2, val3 akan menyimpan nilai infromasi panjang pesan. # Nilai ini dibutuhkan ketika proses decode val1, val2, val3, val4 = cl.setCharLength(len(message)) # ketiga nilai tersebut akan disimpan pada 3 pixel terakhir imgResult[rows - 1, cols - 1] = val1 imgResult[rows - 1, cols - 2] = val2 imgResult[rows - 1, cols - 3] = val3 imgResult[rows - 1, cols - 4] = val4 return imgResult
import cv2 import numpy as np import math # module yg dibuat sendiri import SubProcess.Measurement as msr import SteganographyMethod.Grayscale.PvdGray as pg import SteganographyMethod.Grayscale.MfGray as mg import SubProcess.BitOperation as bo pesan = 'a' pesanBit = bo.word2bit(pesan) print('Isi pesan : ', pesan, ' | Setelah dikonversi menjadi bit : ', pesanBit) img = np.array([[234, 120, 187, 192], [89, 24, 5, 163], [192, 27, 9, 120], [77, 44, 6, 180]]) print('\nnilai matrix sebelum encode : ') for i in range(4): for j in range(4): print(img[i, j], '\t', end=' ') print() imgResult = mg.encode(img, pesan, False) print('\nnilai matrix setelah encode : ') for i in range(4): for j in range(4): print(imgResult[i, j], '\t', end=' ') print() # cv2.waitKey(0) # print(math.log2(32))