예제 #1
0
    def func(cls, args, container, watermark, params, default_metrics,
             callback):
        th = (args[0], args[1], args[2])
        max_b = 2**int(args[3])
        min_b = 2**int(args[4])
        if min_b > max_b:
            max_b = min_b
        qp = args[5]
        sc = args[6]
        params = copy(params)
        params['homogeneity_threshold'] = th
        params['min_block_size'] = min_b
        params['max_block_size'] = max_b
        params['quant_power'] = qp
        params['ch_scale'] = sc
        qtar = QtarStego(**params)

        maxbpp = len(container.getbands()) * 8
        try:
            embed_result = qtar.embed(container, watermark)
            container_image = embed_result.img_container
            stego_image = embed_result.img_stego
            watermark = embed_result.img_watermark
            extracted_wm = qtar.extract(stego_image, embed_result.key)

            cls.eval_callback(callback)

            psnr_ = psnr(container_image, stego_image)
            bcr_ = bcr(watermark, extracted_wm)
            bpp_ = embed_result.bpp
        except:
            return 1

        return sqrt((-1 / psnr_)**2 + (1 - bcr_)**2 + (1 - bpp_ / maxbpp)**2)
예제 #2
0
    def func(cls, offset, container, watermark, params, default_metrics,
             callback):
        params = copy(params)
        params['offset'] = array(offset).astype(int)
        qtar = QtarStego(**params)
        embed_result = qtar.embed(container, watermark)

        cls.eval_callback(callback)

        watermark = embed_result.img_watermark
        extracted_wm = qtar.extract(embed_result.img_stego, embed_result.key)
        return -bcr(watermark, extracted_wm)
예제 #3
0
    def func(cls, threshold, container, watermark, params, default_metrics,
             callback):
        params = copy(params)
        params['homogeneity_threshold'] = threshold
        qtar = QtarStego(**params)
        embed_result = qtar.embed(container, watermark)

        cls.eval_callback(callback)

        watermark = embed_result.img_watermark
        extracted_wm = qtar.extract(embed_result.img_stego, embed_result.key)
        return -bcr(watermark, extracted_wm)
예제 #4
0
    def func(cls, args, container, watermark, params, default_metrics,
             callback):
        max_b = 2**int(args[0])
        qp = args[1]
        sc = args[2]
        params = copy(params)
        params['max_block_size'] = max_b
        params['quant_power'] = qp
        params['ch_scale'] = sc
        qtar = QtarStego(**params)
        embed_result = qtar.embed(container, watermark)

        cls.eval_callback(callback)

        watermark = embed_result.img_watermark
        extracted_wm = qtar.extract(embed_result.img_stego, embed_result.key)
        return -bcr(watermark, extracted_wm)
예제 #5
0
def embed(params, filter_=None):
    container = Image.open(params['container'])
    if 'container_size' in params and params['container_size']:
        container = container.resize(params['container_size'], Image.BILINEAR)
    watermark = Image.open(params['watermark'])
    if 'watermark_size' in params and params['watermark_size']:
        watermark = watermark.resize(params['watermark_size'], Image.BILINEAR)

    qtar = QtarStego(**params)

    embed_result = qtar.embed(container, watermark)

    container = embed_result.img_container
    stego = embed_result.img_stego
    wm = embed_result.img_watermark
    key = embed_result.key

    bpp_ = embed_result.bpp
    psnr_container = psnr(container, stego)
    ssim_container = ssim(container, stego)

    if filter_ is not None:
        stego = filter_(stego)

    extracted_wm = qtar.extract(stego, key)

    bcr_wm = bcr(wm, extracted_wm)
    psnr_wm = psnr(wm, extracted_wm)
    ssim_wm = ssim(wm, extracted_wm)

    return {
        "stego img": stego,
        "extracted wm": extracted_wm,
        "container psnr": psnr_container,
        "container ssim": ssim_container,
        "watermark psnr": psnr_wm,
        "watermark ssim": ssim_wm,
        "watermark bcr": bcr_wm,
        "container bpp": bpp_,
        "key size": key.size
    }
예제 #6
0
    def func(cls, args, container, watermark, params, default_metrics,
             callback):
        th = (args[0], args[1], args[2])
        x = int(args[3])
        y = int(args[4])
        qp = args[5]
        sc = args[6]
        params = copy(params)
        params['homogeneity_threshold'] = th
        params['offset'] = (x, y)
        params['quant_power'] = qp
        params['ch_scale'] = sc
        qtar = QtarStego(**params)

        maxbpp = len(container.getbands()) * 8

        psnr_w = 0.999
        bcr_w = 0.0005
        bpp_w = 0.0005
        try:
            embed_result = qtar.embed(container, watermark)
            container_image = embed_result.img_container
            stego_image = embed_result.img_stego
            watermark = embed_result.img_watermark
            extracted_wm = qtar.extract(stego_image, embed_result.key)

            cls.eval_callback(callback)

            psnr_ = psnr(container_image, stego_image)
            bcr_ = bcr(watermark, extracted_wm)
            bpp_ = embed_result.bpp
        except:
            return 1

        return sqrt(psnr_w * (-1 / psnr_)**2 + bcr_w * (1 - bcr_)**2 + bpp_w *
                    (1 - bpp_ / maxbpp)**2)
예제 #7
0
def test(params):
    container = Image.open(params['container'])
    if params['container_size']:
        container = container.resize(params['container_size'], Image.BILINEAR)
    watermark = Image.open(params['watermark'])
    if params['watermark_size']:
        watermark = watermark.resize(params['watermark_size'], Image.BILINEAR)

    embedding_info = EMBEDDING_INFO_TEMPLATE.format(**params)
    print(embedding_info)

    qtar = QtarStego(**params)

    try:
        with benchmark("embedded in "):
            embed_result = qtar.embed(container, watermark, stages=True)
    except NoSpaceError as e:
        print(e)
        return {
            "container psnr": 0,
            "container ssim": 0,
            "watermark psnr": 0,
            "watermark ssim": 0,
            "watermark bcr": 0,
            "container bpp": 0,
            "key size": 0
        }

    container = embed_result.img_container
    stego = embed_result.img_stego
    wm = embed_result.img_watermark
    key = embed_result.key

    bpp_ = embed_result.bpp
    psnr_container = psnr(container, stego)
    ssim_container = ssim(container, stego)

    if 'ss' in params and params['ss']:
        save_stages(
            embed_result.stages_imgs,
            STAMP_TEMPLATE.format(psnr=psnr_container,
                                  ssim=ssim_container,
                                  bpp=bpp_) if params['st'] else None)

    if 'key' in params and params['key']:
        save_file(key, params['key'])
        key = Key.open(params['key'])

    key_info = KEY_INFO_TEMPLATE.format(key=key)
    print(key_info)

    with benchmark("extracted in"):
        extract_stages_imgs = qtar.extract(stego, key, stages=True)
    extracted_wm = extract_stages_imgs['9-extracted_watermark']

    if 'ss' in params and params['ss']:
        save_stages(extract_stages_imgs)

    bcr_wm = bcr(wm, extracted_wm)
    psnr_wm = psnr(wm, extracted_wm)
    ssim_wm = ssim(wm, extracted_wm)

    metrics_info = METRICS_INFO_TEMPLATE.format(psnr_container=psnr_container,
                                                ssim_container=ssim_container,
                                                psnr_wm=psnr_wm,
                                                ssim_wm=ssim_wm,
                                                bpp=bpp_,
                                                bcr=bcr_wm,
                                                width=wm.size[0],
                                                height=wm.size[1])
    print(metrics_info)
    print("_" * 40 + '\n')
    return {
        "container psnr": psnr_container,
        "container ssim": ssim_container,
        "watermark psnr": psnr_wm,
        "watermark ssim": ssim_wm,
        "watermark bcr": bcr_wm,
        "container bpp": bpp_,
        "key size": key.size
    }