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)
Esempio n. 4
0
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