def embed(self, image_file, watermark=None): if not os.path.exists(self.WATERMARKED_IMAGES_DIRECTORY): os.mkdir(self.WATERMARKED_IMAGES_DIRECTORY) array = self.open_image(image_file) if watermark != None: watermark = self.open_image(watermark) changed_image = self.embed_specific(array, image_file, watermark) # color values range from 0 and 255 and must be integer changed_image = changed_image.clip(0, 255) changed_image = changed_image.astype('uint8') img = Image.fromarray(changed_image) img.save(self.get_image_output_file(image_file)) psnr = Metrics.psnr(numpy.array(Image.fromarray(changed_image).convert('RGB'), dtype=numpy.float), numpy.array(Image.open(image_file).convert('RGB'), dtype=numpy.float)) # such a damn workaround print "PSNR %s" % str(psnr) return changed_image, psnr
def benchmark_extract_step(self, path, image, attack_name, attacked, attacked_path, watermark_file): wmark, gamma = self.extract_specific(numpy.array(Image.open(image)), attacked_path) wmark = wmark.clip(0,255) wmark = wmark.astype('uint8') gamma = Metrics.gamma(wmark.ravel(), numpy.array(Image.open(watermark_file)).ravel()) wmark = Image.fromarray(wmark) wmark.save(os.path.join(path, attack_name + "-extracted-wm-" + os.path.split(image)[1])) return wmark, gamma
def extract_specific(self, image, watermark): f_dct = TwoDimensionalDCT.forward(image) w = self.load_watermark(watermark) xi = [] xo = [] for entry in w: xo.append( entry[self.INSERTED_WATERMARK_VALUE_KEY] ) xi.append( (f_dct[tuple(entry[self.INDEX_KEY])] - entry[self.ORIGINAL_VALUE_KEY]) /\ (self.alpha)) return None, Metrics.gamma(xi, xo)