导航:首页 > 源码编译 > 脆弱水印图像认证算法代码

脆弱水印图像认证算法代码

发布时间:2022-09-22 13:20:20

㈠ 数字图像LSB代码

LSB算法是数字图像信息隐藏应用较早较普遍的算法[3],是在图像信息的最不重要二进制位嵌入秘密信息。根据24位BMP图像文件的结构特点,每个文件只能非压缩地存放一幅彩色图像;文件头由54个字节的数据段组成,其中包含有该位图文件的类型、大小、图像尺寸及打印格式等;从第55个字节开始,是该文件的图像数据部分,由一系列的字节所组成,每连续3个字节便描述图像一个像素点的颜色信息,这三个字节分别代表蓝、绿、红三基色在此像素中的亮度。LSB算法是用图像数据部分每个字节中最低位来隐藏信息。这样每8个字节就可隐藏1个字节的信息[4]。
嵌入信息的方法为:首先,将待隐藏的秘密信息转化为二进制数据码流;然后,将BMP文件图像数据部分的每个字节的最低位替换为需隐藏的信息位。最后,原样复制其他不需要继续隐藏信息的原始数据。从对位图文件的分析,得知偏移量为0x06的4个字节为系统保留,可将被隐藏文件的大小写入该位置,以便提取信息时提前知道有用信息的长度,提高解码效率。对文件头部的其他50个字节,原样复制即可。隐藏过程如图1所示。

图1. LSB图像隐藏算法示意图
Fig.1 LSB data hiding algorithm
信息提取是把隐藏的信息从载体图像中读取出来,其过程和步骤正好与信息嵌入相反。首先,到隐藏信息后的图像文件的0x06处读取被隐藏信息的字节数;然后,从0x36处开始,求取BMP文件图像数据部分每个字节最低位,每够8个字节,便将输出的8位二进制数组成一个字节。经过上述处理,得到一系列8位二进制数,便是隐藏信息的代码,将代码转换成文本、或图像、或声音,就是隐藏的信息。提取过程如图2所示。
由于原始24位BMP图像文件隐藏信息后,其数据部分字节数值最多变化为1,该字节代表的像素颜色值最多只变化了1/256,所以,已隐藏信息的BMP图像与未隐藏信息的BMP图像,用肉眼是看不出差别的。将信息直接嵌入像素RGB值的优点是嵌入信息的容量与所选取的掩护图像的大小成正比。使用这种方法,一个大小为32k的24位BMP图像文件,可以隐藏约32k/8=4k的信息(忽略文件头不能隐藏数据的54个字节),该方法具有较高的信息隐藏率。

图2. LSB图像提取算法示意图
Fig.2 LSB data extracting algorithm
由于该算法是通过调整原始数据的最低位来隐藏信息,使一般用户对于隐藏信息,在视觉和听觉上很难察觉。但作为数字水印算法,该算法因其基本原理限制,所隐藏的数字水印信息是极为脆弱的,无法经受一些无损和有损的信号处理。
3 新的数字水印算法
这种技术的改进,是在基于LSB图像隐藏技术的基础上,对待隐藏的水印信息进行反复的隐藏,因为图片布满水印信息,所以,有很强的抗剪裁能力。
对载体图片进行剪裁后,极有可能会破坏水印信息原有的位置,使我们无法对水印信息进行定位,也就无从实现提取了。因此,这种算法的关键在于如何对水印信息进行同步。下面,提出一种同步的方法:
(1)在数字水印信息前依次连续写入同步信号0000,1111,1111数遍(4遍以上),然后写入前标识符1001,0001,再写入隐藏信息,最后写入后标识符1001,0001。
(2)读入被剪裁后的载体图片的信息位,如果首位是0则跳过,从非0的位开始读取,连续读入8位,判断该数据是否为同步字FF,如果不是同步字FF则继续从非0的位开始读其后的8位,直到连续读出2组同步字FF,证明已经同步,然后一直到读出前标识符,说明其后为隐藏信息位,读出数据,直到读入后标识符,说明隐藏信息已经完整的读完,至此读出一条完整的信息。如图3所示,无论从第1个同步字的任何一位开始读取,可以保证到第3个同步字时已经完成同步操作,第4个同步字完成确认同步并等待前标识的到来。

㈡ 大虾帮帮我关于 数字水印 !!

三、应用:数字水印

消息认证与数字签名可以应用到数字水印中。

传统水印用来证明纸币或纸张上内容的合法性,数字水印(digital watermark)用以证明一个数字产品的拥有权、真实性。数字水印是嵌在数字产品中的数字信息。可以是作者的序列号、公司标志、有特殊意义的文本等。

数字水印主要用于:阻止非法复制(间接的)、确定所有权(作者、发行人、分发商、合法的最终用户)、确定作品的真实性和完整性(是否伪造、被篡改)、证实收件人、不可否认的传送、法庭证据的验证、赝品甄别、识别文件来源与版本、Web网络巡逻监视盗贼等。

传统水印是人眼可以看得见的,而数字水印可以分为可感知的(Perceptible)和不易感知的(Inperceptible)两种。

可感知的数字水印,主要用于当场声明对产品的所有权、着作权及来源,起到一个宣传广告或约束的作用。可感知水印一般为较淡的或半透明的不碍观瞻的图案;比如电视台节目播放的同时,在某个角落插上电视台的半透明标志。另一个用途是为了在线分发作品,比如先将一个低分辨率的有可见水印的图像免费送人,其水印往往是拥有者或卖主的信息,它提供了寻找原高分辨率作品的线索,若想得到高分辨率的原作品则需付费。有些公司在产品出售前为了在网络上宣传其产品,先做上可逆可见水印分发,付费购买时,再用专用软件将可见水印去掉,加入不可见水印(发行人、分发商、最终用户等的信息)。可见水印还有另一些用途,那就是为了节约带宽、存储空间等原因,在VCD、DVD等电影拷贝中用嵌入不可见水印的方式配上多种语言的副标题和字幕,待播放时由硬件根据需要实时地解出每一帧中的水印文字,将其显示在屏幕上。

可见水印在某些产品中或多或少降低了作品的观赏价值,使其用途相对受到一定限制。不易感知的水印的应用层次更高,制作难度更大。

不易感知的数字水印就像隐形墨水技术中的看不见的文字,隐藏在数字产品中。水印的存在要以不破坏原数据的欣赏价值、使用价值为原则。数字水印按照某种方式植入被保护的信息中,在产生版权纠纷时,通过相应的算法提取出该数字水印,从而验证版权的归属。被保护的信息可以是图像、声音、视频或一般性的电子文档等。为了给攻击者增加去除水印的难度,大多数水印制作方案都在水印的嵌入、提取时使用密钥。

图5.7水印的嵌入与提取

数字水印技术虽然不能阻止盗版活动的发生,但它可以判别对象是否受到保护,监视被保护数据的传播、真伪鉴别和非法拷贝、解决版权纠纷并为法庭提供证据。

数字水印的设计需要考虑以下几个方面:

鲁棒性:是指被保护的信息经过某种改动后抵抗隐藏信息丢失的能力。例如传输过程中的信道噪音、滤波操作、重采样、有损编码压缩、D/ A或 A/ D转换、图像的几何变换(如平移、伸缩、旋转、剪裁等)。

不可检测性(不可见性):是指隐蔽载体与原始载体具有一致的特性。如具有一致的统计噪声分布等,以便使非法拦截者很难判断是否有隐蔽信息。

透明性:是指经过一系列隐藏处理后,原始数据没有明显的降质现象。

安全性:要求隐藏算法有较强的抗攻击能力(篡改、伪造、去除水印),使隐藏信息不会被破坏。如不因文件格式转换而丢失水印,且未经授权者不能检测出水印。

自恢复性:由于经过一些操作或变换后,可能会使原数据产生较大的破坏,如果只从留下的片段数据,仍能恢复隐藏信号,而且恢复过程不需要原数据,这就是自恢复性(自相似性)。

水印容量:水印容量和鲁棒性之间是相互矛盾的。水印容量的增加会带来鲁棒性的下降,对不可见性也有影响。为抵抗各种变换,水印通常需要按照一定的排列方式反复加入多次,当水印容量大时重复次数只好减少,而鲁棒性不好就会导致检测结果的不可靠。

数字水印技术有多种分类。

按作用可划分为鲁棒水印和脆弱水印。前者主要应用于数字作品中标志着作版权信息,需要嵌入的水印能够抵抗常见的编辑处理和有损压缩;后者主要用于完整性保护,判断信号是否被篡改。

按水印的载体可分为图像水印、视频水印、音频水印、文本水印和印刷水印等。

按检测方法可分为明水印和盲水印。在检测过程中需要原数据的技术称为明水印,其鲁棒性较强;在检测过程中不需要原数据的技术称为盲水印。

按内容可分为内容水印和标志水印。内容水印是指水印经过攻击受损后人们仍能通过感觉判断内容;标志水印是指通过检测判断来确定信号中是否有水印标志。

按用途可分为版权保护水印、篡改提示水印、票据防伪水印、隐蔽标识水印、印刷数字水印等。

数字水印其内容可以是任何具有代表意义的信息,如图像、文字、数字、符号等,为了便于隐藏,水印的体积越小越好。用文本作为水印信息是较好的选择,既节约空间又能直读出其含义。数字水印主要应用在版权保护、加指纹、标题与注释、篡改提示、使用控制等领域。

版权保护:即数字媒体的所有者可用密钥产生一个水印,并将其嵌入原始数据,然后公开发布他的水印版本作品。数字媒体包括音像制品、数字广播、DVD、MP3等。当该作品被盗版或出现版权纠纷时,所有者即可从盗版作品或水印版作品中获取水印信号作为依据,从而保护所有者的权益。

版权跟踪:为避免未经授权的拷贝制作和发行,出品人可以将不同用户的ID或序列号作为不同的水印嵌入作品的合法拷贝中,称为数字指纹。其目的是通过授权用户的信息来识别数据的发行拷贝,监控和跟踪使用过程中的非法拷贝。一旦发现未经授权的拷贝,就可以根据此拷贝所恢复出的指纹来确定它的来源。

标题与注释:即将作品的标题、注释等内容以水印形式嵌入该作品中,这种隐式注释不需要额外的带宽,且不易丢失。如在遥感图像等信息中隐藏日期、经纬度等。

篡改提示:当数字作品被用于法庭、医学、新闻及商业时,常需确定它们的内容是否被修改、伪造或特殊处理过。为实现该目的,通常可将原始图象分成多个独立块,再将每个块加入不同的水印。同时可通过检测每个数据块中的水印信号,来确定作品的完整性。与其他水印不同的是,这类水印必须是脆弱的,并且检测水印信号时,不需要原始数据。

使用控制:这种应用的一个典型的例子是DVD防拷贝系统,即将水印信息加入DVD数据中,这样DVD播放机即可通过检测DVD数据中的水印信息而判断其合法性和可拷贝性。从而保护制造商的商业利益。

典型数字水印算法包括以下几种算法。

空域算法:此算法首先把一个密钥输入一个m-序列发生器来产生水印信号,然后排列成2维水印信号,按象素点逐一嵌入到原始图象最不重要的像素位枣最低位(LSB:least significant bits)。这可保证嵌入的水印是不可见的。但是由于使用了图像不重要的像素位,算法的鲁棒性差,水印信息很容易为滤波、图像量化、几何变形的操作破坏,因此不够强壮。

文本水印算法:通过轻微改变字符间距,行间距或是增加、删除字符特征如底纹线等方法来嵌入水印。或是在符号级或语义级加入水印,例如,可以用big替换文本中的large。

基于改变图象数据统计特性的水印算法:Patchwork算法首先随机选取N对象素点,然后通过增加象素对中一个点的亮度值,而相应降低另一个点的亮度值。这样整个图像的平均亮度保持不变。适当地调整参数,Patchwork方法对JPEG压缩、FIR滤波以及图像裁剪有一定的抵抗力,但该方法嵌入的信息量有限。

频域算法:它是利用一个信号可以掩盖另一个较弱的信号这一频率掩盖现象。图象的频域空间中可以嵌入大量的比特而不引起可察的降质,当选择改变中频或低频分量(除去直流分量)来加入水印时,强壮性可大大提高。频域水印技术可以利用通用的离散余弦变换,小波变换和傅立叶变换等变换方法。其优点是隐藏效果好,人眼不能发觉与原始图象间的差别;使用密钥控制,只有知晓伪装密钥的人才能解密;可以有效的抵抗剪切及JEPG等有损压缩编码;水印图象可以是灰度图象。但该类算法的隐藏和提取信息操作复杂,隐藏信息量不能很大。

压缩域算法:水印检测与提取直接在压缩域数据中进行。把水印信号加到表示视频帧的数据流中去。MPEG-2数据流可分为数据头信息、运动向量(用于运动补偿)和DCT编码信号块3部分,该算法只有DCT编码信号块被改变。首先对DCT编码数据块中每一输入的Huffman码进行解码和逆量化,以得到当前数据块的一个DCT系数;其次,把相应水印信号块的变换系数与之相加,从而得到水印叠加的DCT系数,再重新进行量化和Huffman编码,最后对新的Huffman码字的位数n1与原来的无水印系数的码字n0进行比较,只在n1不大于n0的时候,才传输水印码字,否则传输原码字,这就保证了不增加视频数据流位率。该方法中水印信号的引入是一种引起降质的误差信号,而基于运动补偿的编码方案会将一个误差扩散和累积起来,为解决此问题,该算法采取了漂移补偿的方案来抵消因水印信号的引入所引起的视觉变形。

NEC算法:该算法由NEC实验室的COX等人提出,在数字水印算法中占有重要地位。COX认为水印信号应该嵌入源数据中对人的感觉最重要的部分。在频谱空间中,这种重要部分就是低频分量。这样,攻击者在破坏水印的过程中,不可避免地会引起图象质量的严重下降。水印信号应该由具有高斯分布的独立同分布随机实数序列构成。这使得水印经受多拷贝联合攻击的能力大大增强。实现方法是:首先以密钥为种子来产生伪随机序列,该序列具有高斯N(0,1)分布,密钥一般由作者的标识码和图象的哈希值组成,对整幅图象做DCT变换,用伪随机高斯序列来调制(叠加)该图象除直流分量(DC)外的1000个最大的DCT系数。该算法具有较强的鲁棒性、安全性、透明性等。

生理模型算法:人的生理模型包括人类视觉系统HVS(HumanVisualSystem)和人类听觉系统HAS。利用视觉模型的基本思想是利用从视觉模型导出的JND(Just Noticeable Difference)描述来确定在图象的各个部分所能容忍的数字水印信号的最大强度,从而能避免破坏视觉质量。也就是说,利用视觉模型来确定与图象相关的调制掩模,然后再利用其来插入水印。这一方法同时具有好的透明性和强健性。

数字水印在版权标识、隐藏标识和篡改提示、数据防伪上具有不可替代的作用,它将在商业、金融、军事和个人消费上带来巨大的商业利润。自1995年以来,该领域的研究工作已经取得了巨大的进展。随着数字水印技术的日趋成熟,数字水印技术将在电子商务、视频点播、远程教学和远程培训中发挥越来越大的作用。

㈢ 图像水印的LSB算法,VC++代码

因为8位像素值的最低位为1或0对整个像素值影响不大,LSB就是把水印信息放入这个最低位,同时保证原始图像基本无变化

void CDib::Embed()//嵌入
{
unsigned char bmdata;//BMP图像数据
unsigned char efdata;//嵌入的文件数据
int t = 7;
int x[8];
int s[8];
int last_bit; //记录字节最低位本来的bit

for(UINT i1 = 0, i2 = 0; i1 <= bitmap_size - 1, i2 <= embfile_size - 1; i1++)
{ //生产隐藏信息,并逐步嵌入到宿主图像各像素的最低位上
bmdata = *p;//p指向图像数据的每个像素,把当前像素值给bmdata

for (int j = 0; j <= 7; j++) //计算各bit位
{
x[j] = bmdata & 1;//提出bmdata最低位放入x[j]
bmdata >>= 1;//右移一位
}

last_bit = x[0];//原始图像的最低位值存入last_bit中
x[0] = x[1] ^ x[2] ^ x[3] ^ x[4] ^ x[5] ^ x[6] ^ x[7];//使最低位值等于其他各位的异或

if (t == 7) //宿主图片每走过八个字节,计算一次s[]
{
efdata = *q;//q指向插入的水印数据
for (j = 0; j <= 7; j++)
{
s[j] = efdata & 1;//水印数据依次放入s[j]中
efdata >>= 1;//右移
}
}
x[0] ^= s[t];//隐藏信息,隐藏信息等于原图像高六位的异或再和文件数据异或
if (last_bit == 0) //嵌入隐藏信息
{
*p |= x[0];//如果该像素原本最低位为0;则将最终得到的异或水印值放入原像素
}
else
{
*p &= 254 + x[0]; //如果该像素原本最低位为1;则将最终得到的异或水印值放入原像素
}

p++;//指向下一个像素
t--;//t用来定时每8个字节插入一次完整的s
if (t == -1) //需要计算一次s[]
{
t = 7;
q++;//指向下一个作为待插入水印的文件数据
i2++;
}
}

}

void CDib::Pick()//提取
{
m_pFile = new unsigned char [embfile_size];//开辟等于插入文件数据大小的内存
unsigned char *q = m_pFile;//q指向该内存

unsigned char bmdata;//插入了水印的BMP图像数据

int x[8];
int s[8];
int t = 7;
for (UINT i1 = 0, i2 = 0; i1 <= bitmap_size - 1, i2 <= embfile_size - 1; i1++)
{
bmdata = *p; //p指向插入了水印的图像数据
for (int j = 0; j <= 7; j++) //计算各bit位
{
x[j] = bmdata & 1;//提取该图像字节的0~7位放入X[]数组
bmdata >>= 1;
}
s[t] = x[0] ^ x[1] ^ x[2] ^ x[3] ^ x[4] ^ x[5] ^ x[6] ^ x[7];//提取1~8个字节中的s[]
t--;
if (t == -1) //s[7]到s[0]组成一个字节
{
*q = s[7] * 128 + s[6] * 64 + s[5] * 32 + s[4] * 16 +
s[3] * 8 + s[2] * 4 + s[1] * 2 + s[0];//还原原始的图像数据
t = 7;
i2++;
q++;
}
p++;//指向下一像素
}

}

㈣ 遗传算法实现数字水印用MATLAB,程序怎么写啊可以把我的积分都给了你

一、嵌入水印信息的MATLAB程序
首先读入原始图象并设置参数,然后嵌入水印信息,程序代码如下:
clear
%
%读入原图象
trueImage=imread('C:\Documents and Settings\ks001\My Documents\My Pictures\lean.tif');
alfa=.1;
LENGTH=2500;
subplot(2,2,1);
imshow(trueImage);
title('原始图象');
%
%对原图象进行DCT变换
dctF1=dct2('C:\Documents and Settings\ks001\My Documents\My Pictures\lean.tif');
subplot(2,2,2);
imshow(log(abs(dctF1)),[ ]);
title('DCT cofficient matrix');
[m,n]=size(dctF1);
%
%产生水印序列并对其排序
radon('right',10);
watermark1=radon(LENGTH,1);
subplot(2,2,3);
title('watermark seqence')
[Y0,I0]=sort(watermark1);
%
%找出水印嵌入位置(幅值较大的n个频域成分)
A=dctF1(:);
[Y1,I1]=sort(A);
x=m*n;
k=LENGTH;
M=zeros(x,1);
%
%修改幅值较大的n个频域成分的幅值,嵌入水印(因为两个问题不同,所以有两个注释符)
for i=1:x
if k>=1
M(x)=Y1(x)*(1+alfa*Y0(k));
k=k-1;
else
M(x)=Y1(x);
end
x=x-1;
end
N=zeros(x,1);
x=m*n;
for i=1:x
N(I1(i))=M(i);
end
a=1;
for j=1:n
for i=1:m
dctF2(i,j)=N(a);
a=a+1;
end
end
%
%DCT反变换,得到嵌入水印的图象
idctF1=idct2(dctF2);
subplot(2,2,4);
imshow(idctF1,[ ]);
title('嵌入水印后的图象');
end

二、提取恢复水印信息的MATLAB程序
水印提取过程是水印嵌入过程的逆过程,相对嵌入过程来说比较复杂,难度较大,下面是水印提取检测的MATLAB程序代码:
function watermark_detect(image,Y1,I0,waterMark1)
%image:嵌入水印的图象
%Y1:原始图象的序列排序
%I0:原始水印的序列排序
%waterMark1:原始水印序列
%
%对嵌入水印图象进行DCT变化
dctW1=dct2(image);
%
%找出幅值较大的系数
B=dtW1(:);
[Y1,I2]=sort(B);
[m1,n1]=size(dctW1);
y=m1*n1;
k=length(waterMark1);
N0=zeros(k,1);
%
%提取水印序列
while k>=1
N0(k)=(Y2(y)-Y1(y))/alfa/Y1(y);
k=k-1;
y=y-1;
end
k=length(waterMark1);
waterMark2=zeros(k,1);
for i=1:k
waterMark2(I0(i))=N0(i);
end
%
%选取50个测试序列,其中第10个为提取出的水印
figure;
for i=1;50
if i==10;
waterMark=waterMark2;
else
waterMark=rand(k,1);
end
%计算各个序列与原来水印序列的相关值
c=waterMark'*waterMark1/sqrt(waterMark'*waterMark);
stem(i,c);
hold on;
end
%

三、接下来对嵌入水印的图象进行不同的攻击,用以测试水印的鲁棒性。
程序的目的和程序代码如下:
%
%攻击实验
disp('input you choice according to the following
image processing operation:');
disp('0--exit');
disp('1--smoothing patterns');
%添加噪音
disp('2--adding uniorm noise 添加噪音');
%滤波
disp('3--adding filter [10 10] 滤波');
%剪切
disp('4--cutting part of the image 剪切');
%压缩
disp('5--10 quality JPEG compressing 压缩');
%旋转45度
disp('6--rotate 45 旋转');
%
d=input('please input you choice(请输入您的选择):');
while d~=0
switch d
case 1
watermark_detect(idctF1,Y1,I0,waterMark1);
case 2
WImage2=idctF1;
noise0=10*rand(size(WImage2));
WImage2=WImage2+noise0;
figure;
imshow(WImage2,[ ]);
title('adding uniform noise 添加噪音');
watemark_detect(WImage2,Y1,I0,waterMark1);
case 3
WImage3=idctF1;
H=fspcial('gaussian高斯',[10,10],5);
WImage3=imfilter(WImage3,H);
figure;
imshow(WImage3,[ ]);
title(through filter [10,10] 滤波');
watemark_detect(WImage3,Y1,I0,waterMark1);
case 4
WImage4=idctF1; WImage4(1:128,1;128)=256;
figure;
imshow(WImage4);
title('cutting part of the image 剪切');
watemark_detect(WImage4,Y1,I0,waterMark1);
case 5
WImage5=idctF1;
WImage5=im2double(WImage5);
cnum=10;
dctm=dctmtx(8);
p1=dctm;
p2=dctm.';
imageDCT=blkproc(WImage5,[8,8],'p1*p2*x',dctm,dctm.');
DCTvar=im2col(imageDCT,[8,8],'distinct').';
n=size(DCTvar,1);
DCTvar=(sum(DCTvar.*DCTvar)-(sum(DCTvar)/n).^2)/n;
[m,order]=sort(DCTvar);
cnum=64-cnum;
mask=ones(8,8);
mask(order(1:cnum))=zeros(1,cnum);
im88=zeros(9,9);
im88(1:8,1:8)=mask;
im128128=kron(im88(1:8,1:8),ones(16));
dctm=dctmtx(8);
p1=dctm.';
p2=mask(1;8,1:8);
p3=dctm;
Wimage5=bikproc(imageDCT,[8,8],'p1*(x.8p2)*p3',dctm.',mask(1:8,1:8),dctm);
figure;
imshow(Wimage5);
title('JPEG Image 压缩');
watemark_detect(WImage5,Y1,I0,waterMark1);
case 6 WImage6=idctF1;
WImage6=imrotate(WImage6,45,'bilinear','corp');
figure;
imshow(Wimage6);
title('rotate 45 旋转');
watemark_detect(WImage6,Y1,I0,waterMark1);
case 0
break;
otherwise
error('you have a valid value(您的输入错误)');
end
d=input('please input you choice(请输入您的选择):');
end
%结束

㈤ Motorola lsb计算方法

计算方法如下:
LSB算法的基本原理:
对空域的LSB做替换,用来替换LSB的序列就是需要加入的水印信息、水印的数字摘要或者由水印生成的伪随机序列。由于水印信息嵌入的位置是LSB,为了满足水印的不可见性,允许嵌入的水印强度不可能太高。然而针对空域的各种处理,如游程编码前的预处理,会对不显着分量进行一定的压缩,所以LSB算法对这些操作很敏感。因此LSB算法最初是用于脆弱性水印的。
LSB算法基本步骤:
1、将原始载体图像的空域像素值由十进制转换成二进制;
2、用二进制秘密信息中的每一比特信息替换与之相对应的载体数据的最低有效位;
3、将得到的含秘密信息的二进制数据转换为十进制像素值,从而获得含秘密信息的图像。

㈥ DCT域图像数字水印算法

%嵌入水印的程序代码
clear
clc
M =512;%原图像长度
N =64;%水印图像长度
K =8;
I=zeros(M,M);J=zeros(N,N);BLOCK=zeros(K,K);
%显示原图像
subplot(2,3,1);
I=imread('liftingbody.png','png');imshow(I);title('原始公开图像');
%显示水印图像
subplot(2,3,2);
J=imread('shuiyin.bmp','bmp');imshow(J);title ('水印图像');
%水印嵌入
for p=1:N
for q=1:N
x=(p-1)*K+1; y=(q-1)*K+1;
BLOCK =I(x:x+K-1,y:y+K-1);BLOCK=dct2(BLOCK);
if J(p,q)==0
a=-1;
else
a=1;
end
BLOCK(1,1)=BLOCK(1,1)*(1+a*0.03);BLOCK=idct2(BLOCK);
I(x:x+K-1,y:y+K-1)=BLOCK;
end
end
%显示嵌入水印后的图像
subplot(2,3,3);
imshow(I);title('嵌入水印后的图像');
imwrite(I,'watermarked.bmp','bmp');
%从嵌入水印的图像中提取水印
I=imread('liftingbody.png','png');
J=imread('watermarked.bmp','bmp');
J=imnoise(J,'gaussian',0,0.01);
subplot(2,3,4);imshow(J,[]);title('加入高斯噪声');
for p=1:N
for q=1:N
x=(p-1)*K+1;
y=(q-1)*K+1;
BLOCK1 =I(x:x+K-1,y:y+K-1);
BLOCK2 =J(x:x+K-1,y:y+K-1);
BLOCK1=dct2(BLOCK1);
BLOCK2=dct2(BLOCK2);
a = BLOCK2(1,1)/BLOCK1(1,1)-1;
if a<0
W(p,q)=0;
else
W(p,q)=1;
end
end
end
%显示提取的水印
subplot(2,3,5);
imshow(W);
title('从含水印图像中提取的水印');
至于分析算法对噪声攻击的抵抗性能.你需要计算PSNR和相关系数NC就可以了

㈦ 如何给JPEG图像加水印,要VC代码(急)

本问介绍了GDI+支持的大多数图像文件格式,以及GDI+提供的处理图像的文件的两个类:Image和Bitmap 我们知道,在以往的图像处理中,常常要根据不同图像文件的格式及其数据存储结构在不同格式中进行转换。某个图像文件的显示也是依靠对文件数据结构的剖析,然后读取相关图像数据而实现的。现在,GDI+提供了Image和Bitmap类使我们能轻松容易地处理图像。

概述

GDI+支持大多数流行的图像文件格式,如BMP、GIF、JPEG、TIFF和PNG等。下面先来介绍这些图像文件,然后再说明Image和Bitmap类支持的特性。

1.图像文件格式简介

图像文件是描绘一幅图像的计算机磁盘文件,其文件格式不下数十种。这里仅介绍BMP、GIF、JPEG、TIFF和PNG等图像文件格式。

BMP文件格式

BMP图像文件格式是Microsoft为其Windows环境设置的标准图像格式。一个Windows的BMP位图实际上是一些和显示像素相对应的位阵列,它有两种类型:一种称之为GDI位图,另一种是DIB位图(Device-Independent Bitmap)。GDI位图包含了一种和Windows的GDI模块有关的Windows数据结构,该数据结构是与设备有关的,故此位图又称为DDB位图(Device-Dependent Bitmap)。当用户的程序取得位图数据信息时,其位图显示方式视显示卡而定。由于GDI位图的这种设备依赖性,当位图通过网络传送到另一台PC,很可能就会出现问题。

DIB比GDI位图有很多编程优势,例如它自带颜色信息,从而使调色板管理更加容易。且任何运行Windows的机器都可以处理DIB,并通常以后缀为.BMP的文件形式被保存在磁盘中或作为资源存在于程序的EXE或DLL文件中。

GIF文件格式

图形交换格式(GIF--Graphics Interchange Format)最早由CompuServe公司于1987年6月15日制定的标准,主要用于CompuServe网络图形数据的在线传输、存储。GIF提供了足够的信息并很好地组织了这些信息,使得许多不同的输入输出设备能够方便地交换图像,它支持24位彩色,由一个最多256种颜色的调色板实现,图像的大小最多是64K x 64K个像点。GIF的特点是LZW压缩、多图像和交错屏幕绘图。

JPEG文件格式

国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合成立的"联合照片专家组"JPEG(Joint Photographic Experts Group)经过五年艰苦细致工作后,于1991年3月提出了ISO CD 10918号建议草案:"多灰度静止图像的数字压缩编码"(通常简称为JPEG标准)。这是一个适用于彩色和单色多灰度或连续色调静止数字图像的压缩标准。它包括无损压缩和基于离散余弦变换和Huffman编码的有损压缩两个部分。前者不会产生失真,但压缩比很小;后一种算法进行图像压缩时,信息虽有损失但压缩比可以很大。例如压缩20~40倍时,人眼基本上看不出失真。

JPEG图像文件也是一种像素格式的文件格式,但它比BMP等图像文件要复杂许多。所幸的是,GDI+的Image提供了对JPEG文件格式的支持,使得我们不需要对JPEG格式有太多的了解就能处理该格式的图像。

TIFF文件格式

TIFF(Tagged Image Format File,标志图像文件格式)最早由Als公司于1986年推出的,它能对从单色到24位真彩的任何图像都有很好的支持,而且在不同的平台之间的修改和转换是十分容易的。与其它图像文件格式不同的是,TIFF文件中有一个标记信息区用来定义文件存储的图像数据类型、颜色和压缩方法。

PNG文件格式

PNG(Portable Network Graphic,可移植的网络图像)文件格式是由Thomas Boutell、Tom Lane等人提出并设计的,它是为了适应网络数据传输而设计的一种图像文件格式,用于取代格式较为简单、专利限制严格的GIF图像文件格式。而且,这种图像文件格式在某种程度上甚至还可以取代格式比较复杂的TIFF图像文件格式。它的特点主要有:压缩效率通常比GIF要高、提供Alpha通道控制图像的透明度、支持Gamma校正机制用来调整图像的亮度等。

需要说明的是,PNG文件格式支持三种主要的图像类型:真彩色图像、灰度级图像以及颜色索引数据图像。JPEG只支持前两种图像类型,而GIF虽然可以利用灰度调色板补偿图像的灰度级别,但原则上它仅仅支持第三种图像类型。

mage和Bitmap类概述

GDI+的Image类封装了对BMP、GIF、JPEG、PNG、TIFF、WMF(Windows元文件)和EMF(增强WMF)图像文件的调入、格式转换以及简单处理的功能。而Bitmap是从Image类继承的一个图像类,它封装了Windows位图操作的常用功能。例如,Bitmap::SetPixel和Bitmap::GetPixel分别用来对位图进行读写像素操作,从而可以为图像的柔化和锐化处理提供一种可能。

3.DrawImage方法

DrawImage是GDI+的Graphics类显示图像的核心方法,它的重载函数有许多个。常用的一般重载函数有:

Status DrawImage( Image* image, INT x, INT y);
Status DrawImage( Image* image, const Rect& rect);
Status DrawImage( Image* image, const Point* destPoints, INT count);
Status DrawImage( Image* image, INT x, INT y, INT srcx, INT srcy,
INT srcwidth, INT srcheight, Unit srcUnit);
其中,(x,y)用来指定图像image显示的位置,这个位置和image图像的左上角点相对应。rect用来指定被图像填充的矩形区域, destPoints和count分别用来指定一个多边形的顶点和顶点个数。若count为3时,则表示该多边形是一个平行四边形,另一个顶点由系统自动给出。此时,destPoints中的数据依次对应于源图像的左上角、右上角和左下角的顶点坐标。srcx、srcy、srcwidth 和srcheight用来指定要显示的源图像的位置和大小,srcUnit用来指定所使用的单位,默认时使用PageUnitPixel,即用像素作为度量单位。

调用和显示图像文件

在GDI+中调用和显示图像文件是非常容易的,一般先通过Image或Bitmap调入一个图像文件构造一个对象,然后调用Graphics::DrawImage方法在指定位置处显示全部或部分图像。例如下面的代码:
void CEx_GDIPlusView::OnDraw(CDC* pDC)
{
CEx_GDIPlusDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

using namespace Gdiplus;
Graphics graphics( pDC->m_hDC );

Image image(L"sunflower.jpg");
graphics.DrawImage(&image, 10,10);

Rect rect(130, 10, image.GetWidth(), image.GetHeight());
graphics.DrawImage(&image, rect);
}
结果如图7.17所示,从图中我们可以看出,两次DrawImage的结果是不同的,按理应该相同,这是怎么一回事?原来,DrawImage在不指定显示区域大小时会自动根据设备分辨率进行缩放,从而造成显示结果的不同。

当然,也可以使用Bitmap类来调入图像文件来构造一个Bitmap对象,其结果也是一样的。例如,上述代码可改为:
Bitmap bmp(L"sunflower.jpg");
graphics.DrawImage(&bmp, 10,10);

Rect rect(130, 10, bmp.GetWidth(), bmp.GetHeight());
graphics.DrawImage(&bmp, rect);
需要说明的是,Image还提供GetThumbnailImage的方法用来获得一个缩略图的指针,调用DrawImage后可将该缩略图显示,这在图像预览时极其有用。例如下面的代码:
Graphics graphics( pDC->m_hDC );
Image image(L"sunflower.jpg");
Image* pThumbnail = image.GetThumbnailImage(50, 50, NULL, NULL);

// 显示缩略图
graphics.DrawImage(pThumbnail, 20, 20);

// 使用后,不要忘记删除该缩略图指针
delete pThumbnail;

图像旋转和拉伸

图像的旋转和拉伸通常是通过在DrawImage中指定destPoints参数来实现,destPoints包含对新的坐标系定义的点的数据。图7.18说明了坐标系定义的方法。

从图中可以看出,destPoints中的第一个点是用来定义坐标原点的,第二点用来定义X轴的方法和图像X方向的大小,第三个是用来定义Y轴的方法和图像Y方向的大小。若destPoints定义的新坐标系中两轴方向不垂直,就能达到图像拉伸的效果。

下面的代码就是图像旋转和拉伸的一个示例,其结果如图7.19所示。
Image image(L"sunflower.jpg");
graphics.DrawImage(&image, 10,10);

Point points[] = { Point(0, 0), Point(image.GetWidth(), 0),
Point(0, image.GetHeight())};
Matrix matrix(1,0,0,1,230,10); // 定义一个单位矩阵,坐标原点在(230,10)
matrix.Rotate(30); // 顺时针旋转30度

matrix.Scale(0.63,0.6); // X 和 Y 方向分别乘以0.63和0.6比例因子
matrix.TransformPoints(points, 3); // 用该矩阵转换points
graphics.DrawImage(&image, points, 3);

Point newpoints[] = {Point(450, 10), Point(510, 60), Point(350, 80)};
graphics.DrawImage(&image, newpoints, 3);

当然,对于图像旋转还可直接使用Graphics::RotateTransform来进行,例如下面的代码。但这样设置后,以后所有的绘图结果均会旋转,有时可能感觉不方便。
Image image(L"sunflower.jpg");
graphics.TranslateTransform(230,10); // 将原点移动到(230,10)
graphics.RotateTransform(30); // 顺时针旋转30度
graphics.DrawImage(&image, 0,0);

调整插补算法的质量

当图像进行缩放时,需要对图像像素进行插补,不同的插补算法其效果是不一样的。Graphics:: SetInterpolationMode可以让我们根据自己的需要使用不同质量效果的插补算法。当然,质量越高,其渲染时间越长。下面的代码就是使用不同质量效果的插补算法模式,其结果如图7.20所示。 Graphics graphics( pDC->m_hDC );
Image image(L"log.gif");
UINT width = image.GetWidth();
UINT height = image.GetHeight();

// 不进行缩放
graphics.DrawImage( &image,10,10);

// 使用低质量的插补算法
graphics.SetInterpolationMode();
graphics.DrawImage( &image,
Rect(170, 30, (INT)(0.6*width), (INT)(0.6*height)));

// 使用中等质量的插补算法
graphics.SetInterpolationMode();
graphics.DrawImage( &image,
Rect(270, 30, (INT)(0.6*width), (INT)(0.6*height)));

// 使用高质量的插补算法
graphics.SetInterpolationMode();
graphics.DrawImage( &image,
Rect(370, 30, (INT)(0.6*width), (INT)(0.6*height)));

事实上,Image功能还不止这些,例如还有不同格式文件之间的转换等。但这些功能和MFC的新类CImage功能基本一样,但CImage更符合MFC程序员的编程习惯,因此下一节中我们来重点介绍CImage的使用方法和技巧。

㈧ 基于Arnold置乱的数字水印图像加密算法的设计,基于Matlab语言编程,完成Arnold置乱算法,并用Matlab GUI工

clc
clear all;
iTimes=10; %置乱次数
% 读入水印图像
file_name='3232水印.bmp';
message=double(imread(file_name));
%水印图像矩阵的行数与列数
Mm=size(message,1);
Nm=size(message,2);
%对水印图像进行arnold置乱
if Mm~=Nm
error('水印矩阵必须为方阵');
end
if Mm~=90
error('必须为90*90大小,或者修改置乱次数');
end
tempImg=message; %图像矩阵赋给tempImg
for n=1:iTimes %置乱次数
for u=1:Mm
for v=1:Nm
temp=tempImg(u,v);
ax=mod((u-1)+(v-1),Mm)+1; %新像素行位置
ay=mod((u-1)+2*(v-1),Nm)+1; %新像素列位置
outImg(ax,ay)=temp;
end
end
tempImg=outImg;
end
% 显示水印,嵌入水印图像与原始图像
figure(1)
subplot(1,3,1);
imshow(message,[]);
title('原始水印');
subplot(1,3,2)
imshow(outImg,[]);
title('置乱水印');
% arnold反置乱
message_arnold=tempImg;
iTimes1=60-iTimes
%置乱后水印图像矩阵的行数与列数
Mo=size(outImg,1);
No=size(outImg,2);
for n=1:iTimes1 % 次数
for u=1:Mo
for v=1:No
temp1=tempImg(u,v);
bx=mod((u-1)+(v-1),Mo)+1;
by=mod((u-1)+2*(v-1),No)+1;
outImg1(bx,by)=temp1;
end
end
tempImg=outImg1;
end
message=outImg1;
% 显示反置乱后水印
%figure(3)
%subplot(1,3,1);
%imshow(message_arnold,[]);
%title('提取的置乱水印');
subplot(1,3,3);
imshow(message,[]);
title('反置乱(恢复)水印');
%subplot(1,3,3);
%imshow(orig_watermark,[])
%title('原始水印')

gui 自己学学吧 matlab中文论坛 gui板块

㈨ 什么是脆弱水印哪位高手详细介绍一下啊 谢谢了

一般用于数据认证的数字水印又可以分为两类:脆弱水印,半脆弱水印.脆弱水印是一种在数字图像作品发生任何形式的改变时都无法检测出来的水印;半脆弱水印一般指能承受图像进行诸如JPEG压缩、加少量噪声的偶然修改,但会被图像内容的恶意篡改损坏的水印.

阅读全文

与脆弱水印图像认证算法代码相关的资料

热点内容
单片机RRC指令 浏览:887
默认加密文件密码 浏览:3
怎么用反诈中心app查询电话 浏览:708
linuxvi操作 浏览:296
什么是实木压缩板 浏览:639
加密空投与硬分叉指南 浏览:15
加密wps文档密码忘了怎么办 浏览:685
冲程算法 浏览:988
鸡料与鸡粪的算法 浏览:833
phpif变量为空值 浏览:59
iot编译器异常 浏览:600
代理服务器被禁用怎么上网 浏览:411
隐私加密怎么设置密码 浏览:940
马丁靴补色解压 浏览:565
在设置app上怎么找到个人热点 浏览:754
按照档案号生成文件夹 浏览:1001
程序员转方向 浏览:111
lol敏捷加密 浏览:882
传统公司眼中的加密货币 浏览:430
电脑图标又出现文件夹怎么去掉 浏览:964