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)
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()))