数字水印技术的python实现

数字水印是一种在数字媒体中嵌入隐藏信息的技术,用于版权保护和内容认证。它分为浮现式和隐藏式,如明水印和盲水印,后者在正常情况下不可见。文章介绍了数字水印的基本原理,包括在信号处理和数字通信领域的视角,并提供了Python代码示例。此外,文章强调了数字水印在版权保护、广播监视、内容认证和使用控制等多个领域的应用。
摘要由CSDN通过智能技术生成

概述
数字水印,是指将特定的信息嵌入数字信号中,数字信号可能是音频、图片或是视频等。数字水印可分为浮现式和隐藏式两种,明水印(visible watermarking),其所包含的信息可在观看图片或视频时同时被看见。盲水印(blind watermarking)是以数字数据的方式加入音频、图片或视频中,但在一般的状况下无法被看见。隐藏式水印的重要应用之一是保护版权,期望能借此避免或阻止数字媒体未经授权的复制和拷贝。数字水印技术是一门新兴的多学科交叉的应用技术,它涉及不同学科领域的理论和技术,如信号处理、图像处理、信息论、编码理论、密码学、检测理论、数字通信和网络技术等。

数字水印的基本原理和框架
所谓数字水印,就是在数字媒体信息(如图像、声音、视频等)中添加某些数字信息,以便保护数字媒体的版权,证明产品的真实可靠性,跟踪盗版或者增添产品的附加信息。水印信息嵌入在载体文件中,不影响原始文件的可观性和完整性。从信号处理的角度看,数字水印可以视为在载体对象的强背景下叠加一个作为水印的弱信号。从数字通信的角度看,数字水印可理解为在一个宽带信道(载体)上用扩频等通信技术传输一个窄带信号。但是,不论如何,数字水印系统都包含水印嵌入器和水印检测器两大部分。嵌入器至少具有两个输入量:一个是原始水印信息,它通过适当变换后作为待嵌入的水印信号;另一个就是要在其中嵌入水印的载体作品。水印嵌入器输出的含水印作品通常用于传播。而检测器的输入至少有一个量,即经过传输之后的作品,当然这取决于水印嵌入器,如果检测器在提取水印时需要原始载体或者原始水印,那么其输入还应该包括原始载体作品或原始水印。另外,在检测器端可以有两个操作,一个是水印检测,它用于判断水印的存在与否;另一个是水印提取,它用于从含水印的载体中提取水印信息,这与检测器的设计和应用场合有关。

数字水印技术的诸多原理
根据信息嵌入方式的不同,可将数字水印的技术方案分为空间域嵌入方案和变换域嵌入方案。最低有效位(Least Significant Bit, LSB)方法是最经典的空间域嵌入方案之一,通过直接修改图片像素值的最低有效位实现水印信息的秘密嵌入。LSB方法对图像视觉质量的影响很小,但是鲁棒性也很低,简单的JPEG压缩操作就能完全破坏掉嵌入的水印信息。在变换域方案中,离散傅立叶变换(Discrete Fourier Transform, DFT)、离散余弦变换(Discrete Cosine Transform, DCT)以及小波变换(Wavelet Transform, WT)都是常用的技术手段。其中, DFT和DCT将图像空间域信号转化为频域信号,把图像的灰度分布函数变换为图像的频率分布函数,具有良好的仿射变换不变性。利用DFT或DCT,可以根据水印信息按需调整频谱系数,从而实现水印在频域上的嵌入操作。此外,WT能够有效地从信号中提取信息,通过伸缩和平移等运算功能对函数或信号进行多尺度细化分析,从而使得频谱能量更为集中,优化水印嵌入性能。因此,基于变换域的数字水印嵌入方案具有较强的鲁棒性,能够抵抗常见的音视频操作和工具。

以下是python代码:

from PIL import Image
import time
import numpy as np
import functools
import sys


def embedding_info(picname, savename, text):
    text += '#%#'  # As end flag
    try:
        im = np.array(Image.open(picname))
    except:
        print("Cannot obtain image, please check file name")
        time.sleep(3)
        sys.exit()

    rows, columns, colors = im.shape
    embed = []
    for c in text:
        bin_sign = (bin(ord(c))[2:]).zfill(16)
        for i in range(16):
            embed.append(int(bin_sign[i]))

    count = 0
    for row in range(rows):
        for col in range(columns):
            for color in range(colors):
                if count < len(embed):
                    im[row][col][color] = im[row][col][color] // 2 * 2 + embed[count]
                    count += 1

    Image.fromarray(im).save(savename)


def extract_info(picname):
    try:
        im = np.array(Image.open(picname))
    except:
        print("Cannot obtain image, please check file name")
        time.sleep(2)
        sys.exit()

    rows, columns, colors = im.shape
    text = ""
    extract = np.array([], dtype=int)

    count = 0
    for row in range(rows):
        for col in range(columns):
            for color in range(colors):
                extract = np.append(extract, im[row][col][color] % 2)
                count += 1
                if count % 16 == 0:
                    bcode = functools.reduce(lambda x, y: str(x) + str(y), extract)
                    cur_char = chr(int(bcode, 2))
                    text += cur_char
                    if cur_char == '#' and text[-3:] == '#%#':
                        return text[:-3]
                    extract = np.array([], dtype=int)


def check_user():
    user_pass = {}
    username = input("Initial capital letter:")
    password = input("your birthday:")
    if username not in user_pass or user_pass[username] != password:
        print("email to author")
        time.sleep(2)
        sys.exit()


def check_pic_format(picture):
    if picture[-4:] != '.png':
        print("Not png, repeat")
        time.sleep(2)
        sys.exit()


def main():
    # check_user()
    print("Welcome to Digital Watermarking Tool")
    choose = input("options:1.Watermark Embedding 2.Watermark Extracting\n")
    if choose == '1':
        picname = input("Select an image to embed: ")
        check_pic_format(picname)
        text = input("Embedded Information: ")
        savename = 'resourceEmbedded.png'
        embedding_info(picname, savename, text)
        print("The digital watermark is inserted successfully!")
    elif choose == '2':
        picname = input("select an image to extract: ")
        check_pic_format(picname)
        text = extract_info(picname)
        print("Extracted Information:", text)
        print("The digital watermark is extracted successfully!")
    else:
        print("error")
        time.sleep(2)
        sys.exit()


if __name__ == '__main__':
    main()

数字水印技术的应用
版权保护是数字水印发展的源动力,也是数字水印技术的一个重要的应用方面,但除此之外,数字水印技术的应用还包括广播监视、内容认证和使用控制等。

数字版权保护可以被细分为所有者鉴别、所有权验证和操作跟踪。
数字水印技术在图像、文档(印刷品、电子文档等)等的真伪认证和完整性鉴别方面也有很大的用途。
广播监视中也可以应用数字水印技术,而且与其他广播监视技术相比,数字水印技术的优点是它存在于被监视的内容之中,优于采用广播信号中的特定片断,因此它与广播设备的安装基础(包括数/模、模/数转换)完全协调一致。已有数家公司可以提供基于水印的广播监视服务。
此外,数字水印还用来做多媒体数据的访问控制和复制控制。例如,CD 数据盘中秘密的数字水印信息可以有条件地控制某些人对该CD 盘中内容的访问权。
数字水印技术还可以应用于信息的安全通信。由于人们很难觉察到数字水印信息在多媒体数据中的存在,某些重要信息在传输的过程中就可以嵌入在普通的多媒体数据中,从而避开第三方的窃听和监控。这种做法与普通的电话通信、电子邮件通信以及加密通信相比,隐蔽性高,不容易监控,而且很难被察觉。
总之,数字水印技术有着宽广的应用范围,对数字水印技术和数字水印技术的应用研究具有重要的意义。
 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值