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)
예제 #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
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)
예제 #6
0
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)
예제 #7
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]
    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
예제 #9
0
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))