基于MATLAB的数字图像水印技术

发布时间 : 星期四 文章基于MATLAB的数字图像水印技术更新完毕开始阅读

《MATLAB应用与通信仿真》课程设计

密匙 原体掩藏 原始水印 隐藏对象 水印检测 图3.3 水印检测框图

是否含有水印

本设计提取水印过程如下:首先将含水印的图像f1中提取出分组码,再对提取出来的分组码进行纠错解码,从而提取出水印。

3.2 水印信号的设计和产生

本设计的水印信号是伪随机实数序列,一般是均值为0,方差为l,即满足N(0,1)正态分布的伪随机实数序列。根据需要,给定一个“种子”作为伪噪声发生器的输入,就可以产生具有高斯分布的白噪声信号。这个“种子”可以是产品的序列号、生产日期,也可以是无任何意义的一个数字,但只能由设计本人保管,因为当序列发生器固定时,“种子”就是产生水印的密钥。在进行水印提取检测时,需要以此密钥来产生和与水印嵌入时相同的伪随机实数序列,用来确定待检测产品中是否含有该水印。

对产生的36?4的水印信号进行(7,4)汉明编码得到一组分组码,再对分组码进行位扩展,得到一组扩展序列,即为伪随机二值序列作为水印信号嵌入原始信号中。

1.汉明编码。汉明码是一种线性分组码,线性分码组是指将信息序列划分 为长度为k的序列段,在每一段后面附加r位的监督码,且监督码和信息码之间构成线性关系。本设计是对水印信号进行(7,4)汉明编码得到一组分码组,再对该分码组进行位扩展后得到伪随机二值序列(-1和1)作为水印信号嵌入原始信号中,实现数字图像水印技术的嵌入过程。

a6a5?a0表示7个码元,其中a6a5a4a3是信息位,a2a1a0是监督位。(7,4)汉明码

如表1:

9

《MATLAB应用与通信仿真》课程设计

表1 (7,4)汉明码

信息位 a6a5a4a3 监督位 a2a1a0 信息位 a6a5a4a3 监督位 a2a1a0 0000 0001 0010 0011 0100 0101 0110 0111

000 011 101 110 110 101 011 000 1000 1001 1010 1011 1100 1101 1110 1111 111 100 010 001 001 010 100 111 2.对水印信号进行位分解。对一幅大小为M×N的8bit、256灰度级的图像,将其按位分解为8层位图,每层每个像素点对应的值只含有0或l。

令X是大小为M×N、灰度级为2L的图像,XP?m,n?是图像的一个像素值。 其中1?m?M,1?n?N。位分解算法的描述如下:

l??1,ifIntegerXp?m,n?/2mod2?1 x?m,n??B?Xp?m,n???? (3-12)

??0,elsell????其中Bl???表示位分解算子,xl?m,n???0,1?。对xl?m,n?的重构公式为

Xp?m,n???xl?m,n??2l (3-13)

l?0L?1

10

《MATLAB应用与通信仿真》课程设计

4 数字图像水印技术的MATLAB函数

MATLAB语言是当今国际上科学界(尤其是自动控制领域)最具影响力、也是最有活力的软件。它起源于矩阵运算,已经发展成一种高度集成的计算机语言。它提供了强大的科学运算、灵活的程序设计流程、高质量的图形可视化界面设计、便捷的与其他程序和语言接口的功能。MATLAB语言在各国高等院校与研究单位发挥着重大的作用。

MATLAB具有强大的数学运算能力、方便实用的绘图功能和语言的高度集成性,它在其他科学与工程领域的应用也越来越广,并且有着更广阔的应用前景和无穷无尽的潜能。如果有一种十分有效的工具能解决在教学和研究中遇到的问题,那么MATLAB语言正是这样的一种工具。它可以将使用者从繁琐、无谓的底层编程中解放出来,把有限的宝贵时间更多地花在解决问题中,这样无疑会提高工作效率。

MATLAB工作环境包括:帮助系统、工作内存管理、指令和函数管理、搜索路径管理、操作系统、程序调试和性能剖析工具等。MATLAB改变了过去单纯依靠“在指令窗通过纯文本指令进行各种操作”面貌,引入了许多让使用者一目了然的图形界面,如在线帮助的交互型界面helpwin、管理工作内存的workspace、交互式的路径管理界面pathtool和指令窗显示风格设置界面等。它们的开启方式为为工具条图标开启、选择菜单项开启和直接“文本式”指令开启。在MATLAB5.0以后的版本中更进一步把图形显示窗改造成了交互操作的可编辑图形界面。

在平常编程实践的基础上,结合数字图像水印技术的整个流程,本部分主要介绍MATLAB图像操作基本函数以及常用于数字图像水印技术的函数,函数的具体用法也可以通过命令:help(函数名)来获取。

4.1 数据输入输出函数

1.imread( )和imwrite( ):可以读写bmp ,jpg/jpeg , tif/ tiff , png , hdf , pcx , wxd 格式文件。读索引文件时,还可以得到相应的调色板数据。其中图象格式文件在读写时要特别注意数据格式。语句A = imread(文件名,‘文件格式’)的作用是从图象文件中读取数据矩阵并写入矩阵变量A中,这个矩阵变量一般为无符号八位整型( uint8 ) 。语句imwrite (A ,文件名,‘文件格式’) 的作用是将数组A中

11

《MATLAB应用与通信仿真》课程设计

的数据写入文件。若A的数据类型为无符号八位整型(uint8),那么可以直接写入;若A 为双精度类型(double) ,那么imwrite会自动完成转换为uint8,然后再写入文件。使用这两个函数,在操作不同类型的图象时,要注意格式是不一样的(特别注意索引图象要带上map)。

2.save( ):将内存变量中的图象保存到以mat为扩展名的文件中。 3.load( ):将以mat为扩展名的文件调入内存。

4.fread( ):当水印内容为文本时,可以实现以二进制读取文本。

4.2 产生水印序列的函数

很多算法是采用随机序列作为水印,恰当运用以下函数可以产生要求的水印。

1.rand( ):产生可控长度的随机序列,其元素在(0,1)之间服从均匀分布。 2.randn( ):产生可控长度的随机序列,其元素服从均值为0,方差为1的正态分布。

另外,上面两个函数可以与fix(向0园整函数)、round(向最近整数圆整函数)、ceil(向无穷圆整函数)等配合产生二值水印序列。如floor ( 2 3(rand (1 ,1000) - 0. 5) ) 产生长度为1000 的{ - 1 ,0}序列;ceil (2 3 ( rand 1 ,1000) - 0. 5) ) 产生长度为1000 的{0 ,1}序列。

4.3 图像显示和图象数据类型

1.imshow( ):显示一幅图像;显示不同类型的图象,格式不一样。在使用fft2 、ifft2 、dct2 、idct2对图像数据处理后, 数据格式会变为double 型,图像无法正常显示,可在使用imshow 时加入参数‘[]’或使用uint8 ( )函数来解决此问题。

2.imfinfo( ):可以得到读入图像的信息。如文件的大小、格式、格式版本号、图象的高度、宽度、颜色类型(真彩色,灰度图还是索引图) 等。

3.isa( )、class( ):用于判断图象的数据类型。

4.uint8( )/im2unit8( ):用于将原来的数据转化为uint8型。注意它们之间的细微差别。另外MATLAB中的函数只有小部分是对uint8型有定义的,如遇到类型错误,要转换为double型处理。

5.double( )/im2double( ):用于将原来的数据转化为double型,可以提高精度。

12

联系合同范文客服:xxxxx#qq.com(#替换为@)