MATLAB数字水印系统

摘  要

数字水印(Digital Watermark)技术是指用信号处理的方法在数字化的多媒体数据中嵌入隐蔽的标记,这种标记通常是不可见的,只有通过专用的检测器或阅读器才能提取。数字水印是信息隐藏技术的一个重要研究方向。随着数字水印技术的发展,数字水印的应用领域也得到了扩展,数字水印的基本应用领域是版权保护、隐藏标识、认证和安全不可见通信。 

当数字水印应用于版权保护时,潜在的应用市场在于电子商务、在线或离线地分发多媒体内容以及大规模的广播服务。数字水印用于隐藏标识时,可在医学、制图、数字成像、数字图像监控、多媒体索引和基于内容的检索等领域得到应用。数字水印的认证方面主要ID卡、信用卡、ATM卡等上面数字水印的安全不可见通信将在国防和情报部门得到广泛的应用。

本文主要是根据所学的数字图象处理知识,在MATLAB环境下,通过系统编程的方式,建立并实现基于DCT域的数字水印加密系统。该系统主要包含数字水印的嵌入与提取,仿真结果表明,数字水印算法具有有效性、可靠性、抗攻击性、鲁棒性和不可见性,能够为数字媒体信息在防伪、防篡改、认证、保障数据安全和完整性等方面提供有效的技术保障。

关键词:数字水印;MATLAB;DCT

  设计背景意义

数字水印技术是用信号处理的方法在数字化的多媒体数据中嵌入隐蔽的标记,这种标记通常是不可见的,只有通过专用的检测器或阅读器才能提取。数字水印是信息隐藏技术的一个重要研究方向。

在数字水印技术中,水印的数据量和鲁棒性构成了一对基本矛盾。从主观上讲,理想的水印算法应该既能隐藏大量数据,又可以抗各种信道噪声和信号变形。然而在实际中,这两个指标往往不能同时实现,不过这并不会影响数字水印技术的应用,因为实际应用一般只偏重其中的一个方面。如果是为了隐蔽通信,数据量显然是最重要的,由于通信方式极为隐蔽,遭遇敌方篡改攻击的可能性很小,因而对鲁棒性要求不高。但对保证数据安全来说,情况恰恰相反,各种保密的数据随时面临着被盗取和篡改的危险,所以鲁棒性是十分重要的,此时,隐藏数据量的要求居于次要地位。

数字水印技术是通过一定的算法将一些标志性信息直接嵌到多媒体内容当中,但不影响原内容的价值和使用,并且不能被人的知觉系统觉察或注意到。水印信息可以是作者的序列号、公司标志、有特殊意义的文本等,可用来识别文件、图像或音乐制品的来源、版本、原作者、拥有者、发行人、合法使用人对数字产品的拥有权。

与加密技术不同,数字水印技术并不能阻止盗版活动的发生,但它可以判别对象是否受到保护,监视被保护数据的传播、真伪鉴别和非法拷贝、解决版权纠纷并为法庭提供证据。总的来说,数字水印可以携带有版权保护信息和认证信息,保护数字产品的合法拷贝和传播。

3  数字水印技术基本原理

3.1  数字水印基本框架

一个数字水印系统一般包括三个基本方面:水印的生成、水印的嵌入和水印的提取或检测。数字水印的嵌入和提取的一般过程基本框架如图3.1,图3.2所示。

3.2  算法分类

根据水印实现方法不同,数字水印可分为空(时)域数字水印和频域数字水印。

空域数字水印是直接在信号空间上叠加水印信号,而频域法加入数字水印的原理是首先将原始信号(语音一维信号、图像二维信号)变换到频域,常用的变换一般有DWT、DCT、DFT、WP和分形。然后,对加入了水印信息的信号进行频域反变换(IDWT、IDCT、DFT、WP),得到含有水印信息的信号。

频域法检测水印的原理是将原始信号与待检测信号同时进行变换域变换,比较两者的区别,进行嵌入水印的逆运算,得出水印信息。如果是可读的水印,那么就此结束,如果是不可读水印,如高斯噪声,就将得出的水印与已知水印作比较,由相关性判断,待检测信号含不含水印,故水印的检测有两个结束点。

频域法有以下优点:嵌入的水印信号能量可以分布到空域的所有像素上,有利于保证水印的不可见性;视觉系统(HVS)的某些特性(如频率的掩蔽特性)可以更方便地结合到水印编码过程中;频域法可与国际数据压缩标准兼容,从而实现在压缩域(compressed domain)内的水印编码。

3.2.1  DCT法

对原始信号做DCT的算法:Cox和Piva等人提出的DCT技术的经典之作。Cox利用随机数发生器产生标准正态序列作为水印信息对图像进行整体DCT变换后,选取除去DC系数之外部分较低频率系数叠加水印信息;Piva则修改整幅图像的中频部分。

对原始信号分块后,再作DCT的算法:Hsu和Wu把图像进行8*8分块,将一个二进制序列作为水印放入DCT的中频区;有些学者则计算整个图像的DCT,把一个实数序列嵌入DCT的中频系数上。选择中频区的好处是一方面尽量减少嵌入信息对图像主观视觉的影响;同时,尽量避免有损压缩对水印信息可能带来的损失。

还有一种DCT方法就是把水印信息嵌入到高频系数上,但是采用这种方法,抗压缩性非常差。

3.2.2  其他方法

其它变换域还有Fourier-mellin域、Fourier变换域、分形或WP(Wavelet Package)等。以上的变换域算法计算量都非常大,编程实现这些变换和逆变换也需要好好下一番功夫,由此造成研究人员把大量的时间和精力浪费在与水印算法研究无关的问题上。

3.3  实际需要考虑的问题

在数字水印技术中,水印的数据量和鲁棒性构成了一对基本矛盾。从主观上讲,理想的水印算法应该既能隐藏大量数据,又可以抗各种信道噪声和信号变形。然而在实际中,这两个指标往往不能同时实现,不过这并不会影响数字水印技术的应用,因为实际应用一般只偏重其中的一个方面。如果是为了隐蔽通信,数据量显然是最重要的,由于通信方式极为隐蔽,遭遇敌方篡改攻击的可能性很小,因而对鲁棒性要求不高。但对保证数据安全来说,情况恰恰相反,各种保密的数据随时面临着被盗取和篡改的危险,所以鲁棒性是十分重要的,此时,隐藏数据量的要求居于次要地位。 

3.3.1  不可见性

对于以模拟方式存储和分发的信息(如电视节目),或是以物理形式存储的信息(如报刊、杂志),用可见的标志就足以表明其所有权。但在数字方式下,标志信息极易被修改或擦除。因此应根据多媒体信息的类型和几何特性,利用用户提供的密钥将水印隐藏到一系列随机产生的位置中,使人无法察觉。图3.3左侧为原始图像,右侧为嵌入水印后的图像。

图3.3 原始图像与嵌入水印后的图像对比

3.3.2  鲁棒性

水印必须对一般的信号处理操作(如滤波、平滑、增强、有失真压缩等)、删除攻击、迷惑攻击等具有鲁棒性。除非对数字水印具有足够的先验知识,任何破坏和消除水印的企图都将严重破坏多媒体信息的质量。

4  基于DCT变换仿真

4.1  算法原理

离散余弦变换(Diserete Cosine Transform)简称DCT变换。离散余弦变换是傅立叶变换的一种特殊情况,在傅立叶级数展开式中,如果被展开的函数是实偶函数,那么其傅立叶级数中只包含余弦项,再将其离散化可导出离散余弦变换,因此余弦变换与傅里叶变换一样有明确的物理意义,DCT变换避免了傅里叶变换中的复数运算,它是基于实数的正交变换。

DCT变换域数字水印算法的基本原理是将空域图像变成频域,然后将水印信息嵌入其直流项之中,最后将频域转换成空域以完成图片的水印的嵌入。其主要思想是:在DCT变换域上选择中、低频系数叠加水印信息,因为人眼的感觉主要集中在中、低频段,攻击者破坏水印时,不可避免地会引起图像质量的严重下降,而且一般的图像处理也不会改变这部分数据。再者,由于JPEG、MPEG等压缩算法的核心是在DCT变换域上进行量化,故通过巧妙的融合水印和量化过程,可以使水印抵御一定的有损压缩。此外,DCT变换域系数的统计分布有比较好的数学模型,可以从理论上估计水印的信息量。基于DCT变换的数字水印在逆变换时会散布在整个图像空间中,故水印不像空间域技术那样易受到裁剪、低通滤波等攻击的影响,具有鲁棒性高、隐蔽性好的特点。

4.1.1  准备工作

首先要读入一幅待嵌入的原始图片I=f1(x,y)以及一幅水印图M=f2(x,y)。由于DCT法需要给原图像进行8*8分块,所以为了便于将一个二进制序列作为水印放入DCT,最好让原图像的行x与列y象素数可以被8整除。如果不能整除需要将x/8与y/8的结果进行取整,其取法遵循向下取整原则。在整除的情况下,对于水印图像,它的行宽不得大于x/8列长不得大于y/8。取x和y均为256即256*256象素,水印图为32*32象素。由此可以看到,整个原图可以划分为x*y/64=1024个变换块如图4.1。

4.1 划分变换块

每个的位置计为(m,n),那么所取的水印图像的每一个象素点可以对应一个变换块进行嵌入。

4.1.2  选取8*8变换块

下面将原图像的每个8*8块分别作DCT变换,在此之前我们需要知道每个块中所包含象素点的坐标。通过图4.1我们不难总结出规律,即:所取(m,n)快中的左上点的行坐标为x=(m-1)*8+1而左上点的列坐标为y=(n-1)*8+1如图4.2

4.2 像素点坐标

由此又可推出该块中所有象素点的坐标,用MATLAB的语句来表示可以写成block_dct1=I(x:x+block-1,y:y+block-1),这样block_dct1矩阵用来表示该块所有象素的值。之后对该块进行DCT变换,从而将空域图像8*8块矩阵变为频域8*8块矩阵。

4.1.3  DCT变换与嵌入

首先,要检测变换块是否含有边界,可以将边界图像与原图相对应位置的象素块提出,将块中所有象素的值(只含0,1)求和的方法检测它是否含有边界,不妨设置一个阈值等于3,即该块中含有三个或以上的边界点就认为该块含有较多的边界信息,通过边界自适应的原理应当将较大的强度值嵌入。

然后,需要将每一个8*8块进行DCT变换,并将变换后的直流分量与强度值和水印图像相应点象素的信息相乘。在这里需要指出的是为了保证提取算法的简单可以令水印图像象素的值减一个比较小的值。

这一步用MATLAB来实现可以用block_dct1=dct2(block_dct1)分别将8*8块进行二维DCT变换,block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*(mark(m,n)-0.1))其中的mark表示水印图像的象素值,将它嵌入块的直流项中。

4.1.4  恢复空域

将嵌入后的块分别进行反DCT变换,并且按顺序存回I矩阵,这时的I就是嵌入水印后的图像。

4.2  水印的提取

这里的水印提取方法可以看作是嵌入的反变换,由于在频域的8*8块的直流量中乘上了与水印信息有关的系数,那么同样我们可以通过原图像与水印图像8*8块直流分量的值相除得到的商即是与水印图像相关的值,由于嵌入时水印图像值只含0、1,而且我们在这个值得后面又减了一个小的常数,因此将除得的商减去1记为cc,这样就可以在嵌入的水印值为0的时候cc<0,反之在嵌入的水印值为1的时候cc>0。这样就可以绘制出水印图像。

5  结果分析

图5.1 运行图

原始图像与嵌入水印后的图像仅有微小的差别,人眼基本分辨不出两图像的任何不同。这说明DCT域水印算法具有较好的不可见性,基本不影响视觉质量,同时也很好的达到了透明性的要求。

图5.2 白噪声攻击后,与原图片对比提取的水印

通过互相关性nc进行评价,计算结果为:nc为0.9849,说明在dct方法中,对于噪声的攻击,其鲁棒性是比较好的。

                      图5.3 提取水印和原水印的互相关性

实验结果在某方面验证了该算法的有效性、可靠性、抗攻击性、鲁棒性和不可见性,能够为数字媒体信息在防伪、防篡改、认证、保障数据安全和完整性等方面提供有效的技术保障。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是爬取某音评论区的 Python 代码: ```python import requests import json # 设置请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 模拟登录并获取cookies session = requests.session() login_url = 'https://passport.xiaomi.com/oauth2/login' session.get(login_url, headers=headers) login_api = 'https://account.xiaomi.com/pass/serviceLoginAuth2?_json=true' post_data = { 'sid': 'passport.xiaomi.com', 'callback': 'https://www.xiaomiyoupin.com/callback', 'qs': '%3FredirectUrl%3Dhttps%253A%252F%252Fm.xiaomiyoupin.com%252Fcomment%252Flist%253FgoodsId%253D118280%2526pageIndex%253D1%2526pageSize%253D10', '_sign': 'yR4M%2Fq%2BMFbqzFYjxZyJ3n9yMx7M%3D', 'serviceParam': '{"checkSafePhone":false}', 'service': 'mipay', 'loginTime': '1629805765', 'showExtra': 'true', 'callbackUrl': 'https://www.xiaomiyoupin.com/callback', 'qsStamp': 'eyJpdiI6InRnWU9pV1B0NzJQcHRoV3h1Zll1TlE9PSIsInZhbHVlIjoiWnZPRjN0bGY1QWpCQng5UWtWc1p4Zz09IiwibWFjIjoiYTJhMzg1ZjdhZjIwNmYzYzk0ZGJmMDY1ZjhhODM3YjQ0MjBhNjQ3YzhlZjM2NzczZjhiZmE5OGJjYjczMjBjZSJ9', 'sidTimeout': '1h', '_json': 'true', 'qsToken': 'eyJpdiI6IjJiNTdUZ21haE1aZzZmQ0xlQXh4dEE9PSIsInZhbHVlIjoiYStGXC9WQzBtRmZ1NU1Wb0tqT1ZUZz09IiwibWFjIjoiYzY2NTk0MjRlNDg0ZmY0ODRmNzU1ZGEyNTUzNzAzNzIzOWUyMzgyMjYzYjlkNjQ2ZDQ1MmRjZjNiNTQ2ZjEyZCJ9', 'deviceId': 'c7b4f0e9-b9da-31da-9c77-9b15a6b64a14', 'pwdMethod': 'pwd', 'user': 'your_account', # 替换成你的账号 'hash': 'your_password' # 替换成你的密码 } session.post(login_api, headers=headers, data=post_data) # 获取评论列表 comment_url = 'https://m.xiaomiyoupin.com/comment/list?goodsId=118280&pageIndex=1&pageSize=10' response = session.get(comment_url, headers=headers) if response.status_code == 200: result = json.loads(response.text) comments = result['data']['list'] for comment in comments: print(comment['content']) else: print('获取评论失败') ``` 需要注意的是,这个代码中的 `your_account` 和 `your_password` 需要替换成你自己的某音账号和密码。同时,由于某音评论区需要登录才能访问,所以在代码中我们先模拟登录并获取 cookies,然后再通过 cookies 访问评论列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值