예제 #1
0
파일: my_insert.py 프로젝트: EroPerez/dhmdi
def insert(cover_image, watermark_image):
    from image_tools.ImageTools import ImageTools
    dqkt = DqKT()
    myqr = MyQR62()
    dat = DAT()
    itools = ImageTools()

    delta = 128

    c = [1, 19]

    if (c[1] - c[0]) != 0:
        # Convirtiendo a modelo de color YCbCr
        cover_ycbcr_array = itools.rgb2ycbcr(cover_image)

        cover_array = cover_ycbcr_array[:, :, 0]
        # Cargando watermark
        watermark = watermark_image.convert("1")

        # Utilizando Arnold Transforms
        for i in range(20):
            watermark = dat.dat2(watermark)

        # obteniendo array de la watermark
        watermark_array = misc.fromimage(watermark)  # Array of watermark

        # Instance a la clase Bloque
        bt_of_cover = BlockTools(cover_array)

        # Calculando e imprimeindo datos iniciales
        len_of_watermark = watermark_array.size

        # Datos de la watermark como lista
        list_bit_of_watermark = watermark_array.reshape(
            (1, len_of_watermark))[0]

        # Utilizar Bloques segun key
        dic = {'semilla': 0.00325687, 'p': 0.22415897}
        valores = []
        cantidad = bt_of_cover.max_blocks()
        for i in range(cantidad):
            valores.append(i)
        v = mypwlcm_limit(dic, valores, len_of_watermark)

        # Marcar los self.len_of_watermark bloques
        for i in range(len_of_watermark):

            dqkt_block = dqkt.dqkt2(
                np.array(bt_of_cover.get_block(v[i] + 1), dtype=np.float32))

            negative = False
            if dqkt_block[get_indice(c[1])[0], get_indice(c[1])[1]] < 0:
                negative = True

            if list_bit_of_watermark[i % len_of_watermark] == 0:
                # Bit a insertar 0
                dqkt_block[get_indice(c[1])[0],
                           get_indice(c[1])[1]] = 2 * delta * round(
                               abs(dqkt_block[get_indice(c[1])[0],
                                              get_indice(c[1])[1]]) /
                               (2.0 * delta)) - delta / 2.0
            else:
                # Bit a insertar 1
                dqkt_block[get_indice(c[1])[0],
                           get_indice(c[1])[1]] = 2 * delta * round(
                               abs(dqkt_block[get_indice(c[1])[0],
                                              get_indice(c[1])[1]]) /
                               (2.0 * delta)) + delta / 2.0

            if negative:
                dqkt_block[get_indice(c[1])[0], get_indice(c[1])[1]] *= -1

            idqkt_block = dqkt.idqkt2(dqkt_block)

            inv = idqkt_block
            for x in range(8):
                for y in range(8):
                    if (inv[x, y] - int(inv[x, y])) < 0.5:
                        inv[x, y] = int(inv[x, y])
                    else:
                        inv[x, y] = int(inv[x, y]) + 1
                    if inv[x, y] > 255:
                        inv[x, y] = 255
                    if inv[x, y] < 0:
                        inv[x, y] = 0

            bt_of_cover.set_block(idqkt_block, v[i] + 1)

        cover_marked_ycbcr_array = cover_ycbcr_array

        image_rgb_array = itools.ycbcr2rgb(cover_marked_ycbcr_array)

    return misc.toimage(image_rgb_array)
예제 #2
0
def extract(watermarked_filename):
    delta = 128
    c = [1, 19]
    from image_tools.ImageTools import ImageTools
    dqkt = DqKT()
    myqr = MyQR62()
    dat = DAT()
    itools = ImageTools()

    watermarked_image = Image.open(watermarked_filename)
    watermarked_ycbcr_image = itools.rgb2ycbcr(watermarked_image)
    watermarked_array = watermarked_ycbcr_image[:, :, 0]
    bt_of_watermarked_image_without_noise = BlockTools(watermarked_array)

    extract = []

    len_of_watermark = 3844

    # Utilizar Bloques segun key
    dic = {'semilla': 0.00325687, 'p': 0.22415897}
    valores = []
    cantidad = bt_of_watermarked_image_without_noise.max_blocks()
    for i in range(cantidad):
        valores.append(i)
    v = mypwlcm_limit(dic, valores, len_of_watermark)

    for i in range(len_of_watermark):

        dqkt_block = dqkt.dqkt2(
            np.array(bt_of_watermarked_image_without_noise.get_block(v[i] + 1),
                     dtype=np.float32))

        negative = False
        if dqkt_block[get_indice(c[1])[0], get_indice(c[1])[1]] < 0:
            negative = True

        C1 = (2 * delta * round(
            abs(dqkt_block[get_indice(c[1])[0],
                           get_indice(c[1])[1]]) / (2.0 * delta)) +
              delta / 2.0) - abs(dqkt_block[get_indice(c[1])[0],
                                            get_indice(c[1])[1]])
        C0 = (2 * delta * round(
            abs(dqkt_block[get_indice(c[1])[0],
                           get_indice(c[1])[1]]) / (2.0 * delta)) -
              delta / 2.0) - abs(dqkt_block[get_indice(c[1])[0],
                                            get_indice(c[1])[1]])

        if negative:
            C1 *= -1
            C0 *= -1
        if C0 < C1:
            extract.append(0)
        else:
            extract.append(1)

    wh = int(math.sqrt(len_of_watermark))
    extract_image = Image.new("1", (wh, wh), 255)
    array_extract_image = misc.fromimage(extract_image)

    for i in range(wh):
        for y in range(wh):
            if extract[wh * i + y] == 0:
                array_extract_image[i, y] = 0

    watermark_array_image = misc.toimage(array_extract_image)
    for i in range(10):
        watermark_array_image = dat.dat2(watermark_array_image)

    b = BlockTools(misc.fromimage(watermark_array_image), 2, 2)
    for m in range(1, b.max_blocks() + 1):
        b.set_color(m)

    return misc.toimage(myqr.get_resconstructed(b.get()))