• 包含DCT域图像水印嵌入与提取算法代码，语言为matlab，可以直接使用
• lsb算法实现简单水印嵌入与提取，lsb是嵌入，lsb2是提取
• 里面有具体实现代码以及图片资源，需要的可以下载
• 基于小波变换的数字水印嵌入与提取_matlab代码，小波变换，水印嵌入，水印提取MATLAB
• 使用matlab实现的小波变换彩色图像水印嵌入提取程序，里面有素材，可以直接运行。亲测可用， 谢谢支持。
• clcclearclose allinput = 'lena12.bmp';Alpha = 0.03;lfile = imread(input);lfile = rgb2gray(lfile);bfile = watermark( input, Alpha );ex_watermark = exactwatermark(bfile...子函数%嵌入function [result]=wa...

clc
clear
close all
input = 'lena12.bmp';
Alpha = 0.03;
lfile = rgb2gray(lfile);
bfile = watermark( input, Alpha );
ex_watermark = exactwatermark(bfile,lfile);
子函数
%嵌入
function [result]=watermark( input, Alpha )
[sizeX,sizeY,bitplane] = size(infile);
block = 8;
block_X_num = sizeX / block;
block_Y_num = sizeY / block;
D1 = zeros(sizeX,sizeY);
infile_gray = rgb2gray(infile);
subplot(2,3,1);imshow(infile_gray);title('Original image');
subplot(2,3,2);imshow(mark);title('Watermark');
for m = 1 : block_X_num
for n = 1 :
block_Y_num
x = (m - 1) * block + 1;
y = (n - 1) * block + 1;
dct_block1 = infile_gray(x:x+block-1,y:y+block-1);
dct_block1 = dct2(dct_block1);
% dct_block1(1,1) = dct_block1(1,1) * (1 + Alpha *
mark(m,n)); dct_block1(1,1) = dct_block1(1,1) * (1 + Alpha *
mark(m,n));
dct_block1 = idct2(dct_block1);
D1(x:x+block-1,y:y+block-1) = dct_block1; end
end
subplot(2,3,3);imshow(D1,[]);title('vi" = vi * (1 + a *
xi)');
result=D1;
end
%提取
function [ result ] = exactwatermark(bfile,lfile)
[sizeX,sizeY] = size(bfile);
block = 8;
block_X_num = sizeX / block;
block_Y_num = sizeY / block;
result=zeros(block_X_num,block_Y_num);
bfile = double(bfile);
lfile = double(lfile);
for p = 1: block_X_num
for q = 1:
block_Y_num
x = (p - 1)*8 + 1; y = ( q -1 )*8 + 1;
if ( lfile(x,y) - bfile(x,y)) > 0
result(p , q) = 1;
else
result(p , q) = 0;
end
end
end
figure; imshow(result,[]); title('提取出的水印');
% figure; imshow(uint8(result));
title('提取出的水印');
end

展开全文
• DCT数字水印嵌入与提取过程 还有几种攻击方式 毕业设计可以使用 各位毕业设计课题相关的可以看看 有不明白的地方可以留言 我看到会尽快回答
• 这篇是我在网上参考的原文，当时我要完成这...LSB图像水印嵌入与提取原创：https://blog.csdn.net/csdn_moming/article/details/50936687 （1）嵌入水印 message='cameraman.tif'; lsb = 3; name = 'D:\ffinal\2...
这篇是我在网上参考的原文，当时我要完成这个任务，搜集资料，也是从别人那找到的。 这篇文章的目的就是将这些整理出来，方便大家参考。
LSB图像水印嵌入与提取原创：https://blog.csdn.net/csdn_moming/article/details/50936687
（1）嵌入水印
message='cameraman.tif';
lsb = 3; name = 'D:\ffinal\2.bmp';
msg_origin = unicode2native(message, 'UTF-8');
msg_bin = dec2bin(msg_origin, 8);
msg = blanks(9);
for i = 1 : size(msg_bin, 1)
msg(i, :) = strcat(msg_bin(i, :), char(mod(i, 2) + '0'));
end
msg = strjoin(cellstr(msg)','');
msg(end) = char(mod(size(msg_bin, 1) + 1, 2) + '0');

len = length(msg) / lsb;
tmp = blanks(len);
for i = 1 : len
tmp(i) = char(bin2dec(msg((i - 1) * lsb + 1 : i * lsb)) + '0');
end

% use RGB
result = image;
rgb = 1;
[len_R, len_G, len_B] = size(result);

for R = 1 : len_R
for G = 1 : len_G
for B = 1 : len_B
if rgb <= len
result(R, G, B) = result(R, G, B) - mod(result(R, G, B), 2^lsb) + double(tmp(rgb) - '0');
rgb = rgb + 1;
end
end
end
end
imshow(result);
imwrite(result, 'D:\ffinal\result.bmp');


（2）提取水印

name='D:\ffinal\result.bmp';
lsb = 3;
index = 1;
rgb = zeros(0);
[len_R, len_G, len_B] = size(image);
flag = char('0');
for R = 1 : len_R
for G = 1 : len_G
tmp = blanks(0);
for B = 1 : len_B
tmp = strcat(tmp, mod(image(R, G, B), 2^lsb) + '0');
end
tmp_bin = dec2bin(tmp - '0', 3)';
rgb(index) = bin2dec(tmp_bin(1 : 8));
if flag + tmp_bin(9) ~= 97
msg_origin = native2unicode(rgb, 'UTF-8');
imshow(j);title('水印图像');
imwrite(j,'D:\ffinal\recover.bmp');
return;
end
index = index + 1;
flag = tmp_bin(9);
end
end


展开全文
• 3 视频水印的嵌入和检测方案3。1水印的预处理采用二值图像作为待嵌入的水印数据，本文针对的研究对象因为是二维图像故采用的是二维Arnold变换。二维Arnold变换定义为:(3-1)其中，(x，y)是原图像的...即在水印嵌入...

3 视频水印的嵌入和检测方案
3。1水印的预处理
采用二值图像作为待嵌入的水印数据，本文针对的研究对象因为是二维图像故采用的是二维Arnold变换。
二维Arnold变换定义为:
(3-1)
其中，(x，y)是原图像的像素点，(x’，y’)是变换后新图像的像素点，N是图像阶数，即图像的尺寸大小，一般多为正方形图像。
由于Arnold变换具有周期性，因此可利用其周期性Period来对图像进行反变换。即在水印嵌入过程中可将水印置乱次数作为密钥times，再进行水印嵌入，当水印提取出来时，再将其继续: (Period-times)次即可使其恢复至原图。这就是利用Arnold的正变换来进行的置乱恢复方案。
Arnold变换次数由版权所有者保管。
对水印进行置乱有以下优点:
(1) 采用置乱技术的合法者可以自由控制算法的选择，参数的选择以及使用随机数技术，从而使非法使用者难以破译图像内容，可以提高水印信息的安全性;
(2) 置乱技术可以分散错误比特的分布，提高数字水印的视觉效果，从而增强其鲁棒性。
3。2 视频水印的嵌入
水印嵌入算法关键在于以下三点:
(1) 水印的结构;
(2) 水印的嵌入区域;
(3) 嵌入技巧;
本文选取二值图像作为水印。
为了提高水印的鲁棒性，大多数的DCT域水印算法把水印信号嵌入到DCT系数的低频部分。但低频区域是图像的能量集中部分，嵌入到低频会降低透明性。而嵌入在高频虽然透明性比较好，但对大多数的图像处理对高频成分影响较大，从而降低水印的鲁棒性。于是大多数的水印算法将水印信号嵌入在载体图像DCT系数的中频部分，以达到透明性和鲁棒性的最佳折衷。
各种嵌入技巧的最终目的还是为了尽量地提高水印的鲁棒性和透明性。
用于版权保护的数字水印在尽量提高鲁棒性的同时还要满足人类的视觉极限，因此必须根据HVS找到嵌入位置。
本文将HVS归纳为运动敏感性、纹理敏感性和亮度敏感性。
在接下来的嵌入过程中，充分利用了这些特性。如图3-1中间分支所示。
嵌入过程如图3-1所示。
图3-1 水印嵌入过程
从视频中读取亮度分量Y，因为它是最有效的数据，根据NEC算法，嵌入到它里面的水印才具有最强的鲁棒性。
根据式(3-2)所示的运动敏感性阈值计算公式，寻找32帧满足敏感性比较大的视频帧Yi (i=1,2,…32)。
(3-2)
其中 (t代表当前帧的编号)
接下来，将Y32中的数据按照64*64的尺寸切分成20块BYij (j=1,2,…20)，于是我们可得到20块尺寸为64*64*32的三维数据块BYk (k=1,2,…20)，如图2-3所示。
图3-2 亮度分量的分块
根据式(3-3)、式(3-4)所示的亮度敏感性Lk和纹理敏感性Dk计算公式，通过计算，我们选择计算值都比较高的20块数据中的一块 ( )作为水印的嵌入块。
(3-3)
(3-4)
其中， 是BYk中的亮度数据， 。
最后，折衷考虑复杂度和性能，我们对选定的一块数据块 实施了2阶三维DCT变换。
根据NEC算法的思想，且为了抵抗滤波和压缩攻击，我们将置乱后的水印序列嵌入到了第一帧DCT系数c(u,v)中，详见式(3-5)。
(3-5)
其中，w(u,v)是水印序列中的数据，c(u,v)是DCT变换后第一帧中的系数，c’(u,v)是嵌入水印后的系数，S是非负整数(且满足T1=S/4, T2=3*T1)。
嵌入完成后，对c’(u,v)实施反2阶三维DCT变换就得到了嵌入水印后的视频数据，再将它们放回原来的位置即可。
需要说明的是，在整个嵌入过程中，所有用到的参数都应作为密钥保留。
具体方案如下所述:
第一步:抽取32帧视频Y分量数据:
(1) 读取视频文件;
(2) 提取所有的Y分量，把所有的Y分量分为32组;
(3) 每组4帧,从各组中选出一个最运动敏感的，判断每组中最大的Y_deltmax，存入变量m;
(4) 定位最大的Y_deltmax,存入变量w;
Y32是就是所需的视频帧中Y分量满足敏感性的32帧视频 (355*288*32)。
第二步:分块过程:
(1) 对行分块(4块);
(2) 对列分块(5块);
(3) 隔十帧取一帧，共从32帧中取4帧以降低运算量;
(4) 一个数一个数的赋值;
切成20块，每块为64*64*4的数据块BY,维数不同，只能逐个象素赋值。
第三步:根据公式计算数据块BY的亮度敏感性L和纹理敏感性D
第四步:选取L和D都比较大的一块嵌入水印
(1) 判断最大的L，存入变量Lm;
(2) 去掉这个最大的块再比较;
(4) 赋第一块的L的权重为20;
(5) 计算第2块到第20块的L的权重;
(6) 同理对D进行处理;
(7) 计算每块BY的权重;
(8) 对所有的20块BY的权重qz按由小到大的顺序进行排序，并保持原来的位置索引index，则index[20]就是所要选取的块;
第五步:三维DCT变换
由于视频是由图像数据流组成的，所以可以把视频的每一帧看作是一幅静止的图像。
对运动图像序列进行3D-DCT，可以视为先对视频的每一帧进行2D-DCT，再对帧间方向进行1D-DCT。
第六步:嵌入水印数据
将置乱的水印序列嵌入所选的DCT系数中，即嵌入经过3D-DCT变换后的数据块中的第一帧数据中。
然后把这些数据进行反3D-DCT变换后放回原位置。
第七步:将所选的数据放回原位置
最后一步:写视频文件
3。3视频水印的检测
水印提取是嵌入的逆过程，本算法的一大优势是，水印提取时无需原始视频数据的参与，但依然需要一些参数。
它们是:
(1) 嵌入过程第四步产生的块BY的排序结果，由此我们可以得知水印的大致嵌入位置;
(2) 嵌入时指定的参数S;
(3) 需要Arnold变换的次数和周期;
获得了上面的各项参数，水印的提取就十分简单，具体过程如图3-3所示。
图3-3 水印盲提取过程
方案如下:
从待提取水印的视频数据 (可能是被攻击过后的视频)中抽取出亮度分量Y’，根据密钥，抽出32帧中的四帧亮度分量 ，然后分别从这组数据中提取水印。
在图3-3中，首先将 分隔成20块 ，并找到和 对应的 。然后，对 做二阶三维DCT变换，根据式(3-6)提取出水印数据 。
(3-6)
其中， 是DCT系数。
最后，我们将 进行Arnold变换，得到水印图像，作为最终提取出的水印。
具体步骤如下所述:
第一步:抽取32帧视频Y分量数据:
(1) 读取嵌入水印图像的视频文件;
(2) 提取所有的Y分量，把所有的Y分量分为32组;
(3) 每组4帧,从各组中选出一个最运动敏感的，判断每组中最大的Y_deltmax，存入变量m;
(4) 定位最大的Y_deltmax,存入变量w;
Y32是就是所需的视频帧中Y分量满足运动敏感性的32帧视频，Y32是一个355*288*32的三维数组。
第二步:分块过程:
(1) 对行分块(4块);
(2) 对列分块(5块);
(3) 隔十帧取一帧，从32帧中共取4帧以降低运算量;
(4) 一个数一个数的赋值;
切成20块，每块为64*64*4的数据块BY,维数不同，只能逐个象素赋值。
经过计算其亮度敏感性和纹理敏感性并排序，index[20]就是本文算法中嵌入水印的块;
第三步:三维DCT变换
第四步:Arnold变换
由于本算法中水印图像是二值图像，其Arnold变换是二维变换，周期是Period，嵌入水印时变换了times次，所以此处只需变换(Period-times)次就可得到结果。
第五步:写图像文件
提取水印图像数据并写成图像文件
第六步:检测水印图像存在与否，并与原水印图像比较。
最后一步:进行实验，验证本文算法的可见性和鲁棒性。
经过以上步骤就是水印图像信息嵌入视频中的方法，具体实现过程见第四章。
4 用MATLAB实现视频水印的嵌入和检测
Matlab是近年来在国内外广泛流行的一种可视化科学计算软件。它的特点是结构简单、数值计算高效、图形功能完备、图像处理方便，是国际公认的最优秀的科学计算与数学应用软件之一。
利用Matlab实现数字水印图像算法便捷、高效，省去了繁琐的程序代码，避免了科研人员在编程上浪费精力。
其内容已涉及矩阵代数、微积分、应用数学、信号与系统、神经网络、小波分析及应用、数字图像处理、计算机图形学、自动控制与通信技术等诸多方面，是科学计算、系统仿真、信号与图像处理的主流软件，受到了各方科研人员的青睐，在数字水印技术中得到了广泛的应用。
将Matlab应用于数字水印技术，其优点主要有以下几个方面:
(1) 强大的数值计算功能
视频水印技术是针对图像进行研究的，而图像是由矩阵表达的，将水印嵌入视频中及从视频中将水印提取出来都意味着大量的矩阵运算，而矩阵运算更是Matlab语言的核心，表达自然、直接。
因此，利用Matlab强大的矩阵运算功能来实现图像水印技术非常合适。
(2) 方便的图像读取和显示功能
视频水印首先要将数据从视频中读取出来，嵌入水印后还要将嵌入水印后的数据还原为视频。Matlab为用户提供了专门的图像处理函数，用于读写显示图像数据。
这种方法不像其他编程语言那样，需要编写复杂的代码，只需要简单地调用Matlab提供的函数即可，相关的函数及其功能主要有下列一些:
imwrite 将图像写入磁盘;
image 提供最原始的图像显示函数;
imshow 是最常用的显示各种图像的函数;
(3) 高效的图像变换功能
数字水印嵌入算法一般分空域方法和频域方法。
空域方法指通过改变象素的亮度值来加入数字水印:频域方法指图像通过某种变换后再嵌入数字水印。与空域法相比，频域法具有如下优点:在变换域中嵌入的水印信号可以分布到空域的所有象素上，有利于保证水印的不可见性。在变换域中，视觉系统的某些特性(如视频特性)可以更方便地结合到水印编码过程中。
变换域的方法可以与国际数据压缩标准兼容，从而实现压缩域内的水印编码。因此，变换域的方法应是水印算法未来趋势的主流。但是变换域的算法一般来讲计算量都比较大，需要复杂的编程运算，Matlab则改变了这种现状。在Matlab图像处理工具箱中，提供了常用的图像变换函数，复杂的变换域算法在Matlab中只需简单地调用函数即可实现，充分体现了使用Matlab的简便性和高效性。
主要图像变换函数如下:
dct是一维离散余弦变换;
idct是一维离散余弦逆变换;
dct2是二维离散余弦变换;
idct2是二维离散余弦逆变换;
(4) 丰富的图像处理函数
水印技术要求嵌入的水印不可见且有较强的鲁棒性。
不可见性可通过视觉效果和计算图像的峰值信噪比来比较优劣，而鲁棒性则要对水印后图像进行各种攻击，通过比较攻击后图像提取出的水印情况来说明问题。Matlab有各种图像处理函数，可实现对图像的各种攻击。
综上所述，Matlab具有语言简洁、函数丰富、使用方便、数值计算高效等特点，将功能强大的Matlab软件应用于数字水印技术是有效的选择，因此，本文采用Matlab对图像水印进行研究。
4。1水印的嵌入过程
(1) 基于Arnold变换的图像置乱
Matlab实现如下:
Arnold变换由function r=Arnold(w0,row,colum,times) 实现，其中w0为读取的图像数据，row是行数，colum是列数，times是Arnold变换次数。
function r=Arnold(w0,row,colum,times)
for k=1:times
for i=1:row
for j=1:colum
i1=i j;
j1=i 2*j;
if i1>row
i1=mod(i1,row);
end
if j1>colum
j1=mod(j1,colum);
end
if i1= =0
i1=row;
end
if j1= =0
j1=colum;
end
w1(i1,j1)=w0(i,j);
end
end
w0=w1;
end
r=w0;
用imwrite(w0,'Arnold。
bmp', 'bmp')写置乱后的图像文件;在MATLAB中用imshow('Arnold。bmp')显示此图像。
本文采用二维的二值水印图像watermark。bmp，我们将图像数据(64*64)扫描到二维的矩阵中并实施Arnold变换，从而得到置乱后的二维矩阵。
随着迭代次数的增加，图像逐渐趋于混乱，不过到一定次数时，又将回到原图。因为watermark。bmp大小为64*64，故经过试验图像迭代48次后将回到原图,即周期性Period=48。
本算法选择置乱8次，因为8次Arnold变换后原水印图像已经成为无形状的图像。
实验结果表明，该方法能较好地刻划图像的置乱程度，与人的视觉基本相符。但需要指出的是不一定图像的置乱次数越多其置乱度就越高。所以，在水印嵌入时，为了提高其鲁棒性而增加置乱次数的方法是不科学的，合理的做法是计算置乱后图像的置乱度，达到较为满意的置乱度后就可停止置乱，避免盲目的提高置乱次数。
置乱次数作为密钥有视频版权所有者保管，如果非法所有者不知道置乱次数就很难恢复出原水印图像。
原水印图像如图4-1所示，本算法实现置乱8次后效果如图4-2所示:
图4-1 水印原图像 图4-2 置乱8次后
(2)Matlab实现嵌入过程:
本文中选取352×288×142的yuv格式视频流进行测试。
YUV颜色模型是一种常用的颜色模型，其基本特征是将亮度信号与颜色信号分离，由于人眼对亮度的变化比对颜色的变化敏感，因此，YUV模型中Y分量的值所占带宽大于等于彩色分量所占带宽。YUV色彩空间模型可以在一定程度上避免RGB模型的高分散性和高相关性所带来的闭值划分问题，计算也较为简单。
这种色彩空间模型中Y和UV分量是相互独立的，反映了人眼观察彩色的视觉规律，在实际中应用较多。其中“Y”表示明亮度(Luminance或Luma)，也就是灰阶值;而“U”和“V”表示的则是色度(Chrominan“或Chroma)，作用是描述影像色彩及饱和度，用于指定像素颜色。
因此选择YUV颜色空间更加稳定，易于分析。
本文选择测试视频中的第39帧如图4-3所示。YUV格式的视频中Y:U:V=4:2:2，但通俗叫“420”格式。
图4-3 未嵌入水印的视频
第一步:读取文件;
yuv是一个四维数组，它返回的是视频的yuv分量,Y是亮度分量,u和v是色彩分量,num_f是视频文件中所有帧的数目。
读取一帧数据的YUV分量在Matlab中由以下源代码实现:
[Teil_h,Teil_b]=YUVFormat(format);
fileId = fopen(fileName,'r');
YUV(:,:,1)存放Y分量;YUV(:,:,2)存放U分量;YUV(:,:,3)存放V分量;Y,U,V是三个分量的实际值，二维矩阵，没有重复，他们的长度可能不一样。
Y_delt(j)=delt(Y(:,:,w(i)),Y(:,:,4*(i-1) j));
其中Y_delt是当前帧与下一组各帧的Y的差，m(i)=max(Y_delt(j));判断每组中最大的Y_deltmax，存入变量m，以此来得到每组中最运动敏感的视频帧。
w(i 1)=4*(i-1) k定位最大的Y_deltmax,存入变量w。
最后得到Y32=double(Y(:,:,w))， Y32是视频帧中Y分量满足敏感性的32帧视频是一个355*288*32的三维数组。
第二步:分块;
分块时因为需要块标号，由此造成维数不同，所以只能逐个象素赋值，在Matlab中由BY(t1,t2,t3,j*5 k 1)= double(Y32((64*j t1),(64*k t2),i))实现，切成20块，每块为64*64*4的数据块BY ，其中t1是块的杭坐标，t2是块的列坐标，t3帧标号，j*5 k 1是快标号。
第三步:三维DCT变换;
运动图像序列的每一帧可以看作是静止图像 对运动图像序列进行3D DCT，可以视为先对每帧进行2D DCT，再对帧间方向进行1D DCT。
%对每一块的帧间方向进行1D DCT变换
for i=1:64
for j=1:64
dcta(i,j,1:4,index(20))=dct(BY(i,j,1:4,index(20)));
end
end
%对每一块的每一帧进行2D DCT
for i=1:4
dct3a(:,:,i,index(20))=dct2(dcta(:,:,i,index(20)));
end
第四步:嵌入水印过程;
bmp'))实现 ，message是一个由0和1组成的二维数组。
将置乱的水印序列嵌入所选的dct系数中，源代码如下所示:
其中dct3a是DCT系数，index[20]是纹理敏感性和亮度敏感性都比较好的一块，S作为密钥由版权所有者保管。
S=60;
T1=S/4;
T2=3*T1;
for i=1:64
for j=1:64
if (w2(i,j)==1)
if (dct3a(i,j,1,index(20))>=0)
dipin(i,j)=dct3a(i,j,1,index(20))-mod(dct3a(i,j,1,index(20)),S) T1;
end
if (dct3a(i,j,1,index(20))=0)
dipin(i,j)=dct3a(i,j,1,index(20))-mod(dct3a(i,j,1,index(20)),S) T2;
end
if (dct3a(i,j,1,index(20))=((T1 T2)/2))
shuiyin(i,j)=0;
end
end
end
Arnold反变换如下所示:
w0=shuiyin;
w2=Arnold(w0,Hm,Wm,40);
w0是检测到的水印数据，Hm和Wm是水印数据的行和列,变换次数为40。
写水印文件，检测水印图像存在与否，并且和原水印图像有无差异。
imwrite(w2,'恢复。bmp', 'bmp');
imshow('恢复。bmp');
综上，水印的嵌入主要经过将视频和水印分别进行预处理，然后根据嵌入算法选择水印的合适嵌入位置以及合理嵌入策略，从而得到含水印的视频数据。
在各个环节中采用HVS特性来提高视频水印的鲁棒性。最后用相应的视频水印检测策略提取出水印从而实现视频的保护。结果显示本文算法能成功提取出水印图像。
全部

展开全文
• 基于DWT的数字水印嵌入与提取 思路清晰 有MATLAB代码，原理介绍详细；
• 一、DCT数字水印嵌入与提取简介 1 基本DCT变换 目前，基于DCT域的水印方法已经成为数字水印算法研究的热点，它的核心思想就是通过离散傅立叶变换对图像块进行处理后，再选择变换域中的一些系数值依据一定规则来嵌入...
一、DCT数字水印嵌入与提取简介
1 基本DCT变换 目前，基于DCT域的水印方法已经成为数字水印算法研究的热点，它的核心思想就是通过离散傅立叶变换对图像块进行处理后，再选择变换域中的一些系数值依据一定规则来嵌入水印。 由于图像块中DCT系数频带分布由左上角的直流分量DC往下对应的系数频率由低频升至高频，因此在不影响原图质量的前提下，可将水印信息根据能量大小嵌入相应系数频带中。通过图像块量化与水印嵌入结合的处理方法将水印信息均匀分布在图像的整个空间域，在图像裁剪和滤波方面，变换域的水印比在空间域的更能表现出一定的鲁棒性。
2 水印算法描述 2.1 水印嵌入算法 该算法采用加性嵌入的方式在经过DCT变换后的子图像块的中频域中，选取隐秘位置嵌入水印信息，具体的嵌入流程如下图1所示：  图1 分块水印嵌入流程 (1）分块处理：设宿主图像为P，将其分块处理为8*8的K个子块。 (2）水印预处理：设水印图像为W，对其进行互补变换，变换后的水印图像和变换前的水印图像相互补。 (3）对水印图像进行Arnold置乱变换，并依据混沌映射规则，选取密钥混沌序列并与水印序列异或运算，将置换次数和异或运算处理后的结果分别作为水印嵌入算法的密钥1和密钥2。 (4)DCT变换：对各子块内做DCT变换，利用zig-zag对DCT系数进行扫描，得到第k块子图像块的序列为Zk(i),i=0,1,2，…63. (5）水印嵌入算法：依据zig-zag排序，在各子块的中、低频段选取特定系数x(m）和x(n），在系数坐标（a,b）和（c,d）处嵌入水印信息图像W，并将其作为密钥3。同理，嵌入互补水印图片W’，并将嵌入的位置作为密钥4。水印嵌入的方法如下：   (6)IDCT变换：将每一个子图像块作二维DCT逆变换。 (7）子块合并：将每一个子块合并成嵌入水印的图像P’。
2.2 水印提取算法 将嵌入水印的图像P’分块处理，并对各子块进行二维DCT变换，由密钥3和4推断所选择的水印系数，若x(m）≤x(n），则水印信息为0，若x(m)>x(n），则水印信息为1，再利用密钥1和2将初步水印的信息解密再进行Arnold逆变换，最终提取出水印信息。
2.3 水印检测算法 本文通过计算峰值信噪比PSNR的值评价嵌入水印的宿主图像的质量，一幅m和n的图像，PSNR度量标准定义为：  归一化相关系数NC的值判断嵌入水印的图像与宿主图像的相似度，其定义为：
二、部分源代码
function varargout = wmark_enc_export(varargin)
%
%
%
%
% WMARK_ENC_EXPORT MATLAB code for wmark_enc_export.fig
%      WMARK_ENC_EXPORT, by itself, creates a new WMARK_ENC_EXPORT or raises the existing
%      singleton*.
%
%      H = WMARK_ENC_EXPORT returns the handle to a new WMARK_ENC_EXPORT or the handle to
%      the existing singleton*.
%
%      WMARK_ENC_EXPORT('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in WMARK_ENC_EXPORT.M with the given input arguments.
%
%      WMARK_ENC_EXPORT('Property','Value',...) creates a new WMARK_ENC_EXPORT or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before wmark_enc_export_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to wmark_enc_export_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%

% Edit the above text to modify the response to help wmark_enc_export

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
'gui_Singleton',  gui_Singleton, ...
'gui_OpeningFcn', @wmark_enc_export_OpeningFcn, ...
'gui_OutputFcn',  @wmark_enc_export_OutputFcn, ...
'gui_LayoutFcn',  @wmark_enc_export_LayoutFcn, ...
'gui_Callback',   []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT

% --- Executes just before wmark_enc_export is made visible.
function wmark_enc_export_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to wmark_enc_export (see VARARGIN)

% Choose default command line output for wmark_enc_export
handles.output = hObject;
axes(handles.iim); axis off
axes(handles.oim); axis off
axes(handles.omsg); axis off
axes(handles.demsg); axis off
set(handles.emmsg,'Enable','off')
set(handles.extmsg,'Enable','off')
set(handles.msg,'Enable','off')

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes wmark_enc_export wait for user response (see UIRESUME)
% uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line.
function varargout = wmark_enc_export_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

% --- Executes on button press in exit.
function exit_Callback(hObject, eventdata, handles)
% hObject    handle to exit (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
close wmark_enc

% --- Executes on button press in extmsg.
function extmsg_Callback(hObject, eventdata, handles)
% hObject    handle to extmsg (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
embimg=handles.embimg;
wm=exwmark(embimg);
axes(handles.demsg); imshow(wm); title('Extracted MSG')
handles.wm=wm;
guidata(hObject,handles)

% --- Executes on button press in emmsg.
function emmsg_Callback(hObject, eventdata, handles)
% hObject    handle to emmsg (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
img=handles.img; msg=handles.msg;
h=warndlg('Wait....','Processing');
[embimg,ps]=wtmark(img,msg);
handles.embimg=embimg;
axes(handles.oim); imshow(embimg); title('Embedded Image')
set(handles.impsnr,'String',ps)
set(handles.extmsg,'Enable','On')
close(h)
guidata(hObject,handles)

% --- Executes on button press in inp.
function inp_Callback(hObject, eventdata, handles)
% hObject    handle to inp (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[fname path]=uigetfile({'*.jpg';'*.bmp';,'*.jpeg';'*.tiff';'*.png'},'Browse Image');
if fname~=0
if length(size(img))>2
img=rgb2gray(img);
end
axes(handles.iim); imshow(img);
title('Orignal Image')
handles.img=img;
set(handles.msg,'Enable','on')
else
end
guidata(hObject,handles);

% --- Executes on button press in msg.
function msg_Callback(hObject, eventdata, handles)
% hObject    handle to msg (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[fname path]=uigetfile({'*.jpg';'*.bmp';,'*.jpeg';'*.tiff';'*.png'},'Browse Image');
if fname~=0
if length(size(msg))>2
msg=rgb2gray(msg);
end
axes(handles.omsg); imshow(msg);
title('MSG')
handles.msg=msg;
set(handles.emmsg,'Enable','on')
else
end
guidata(hObject,handles);

% --- Creates and returns a handle to the GUI figure.
function h1 = wmark_enc_export_LayoutFcn(policy)
% policy - create a new figure or use a singleton. 'new' or 'reuse'.

persistent hsingleton;
if strcmpi(policy, 'reuse') & ishandle(hsingleton)
h1 = hsingleton;
return;
end

三、运行结果

四、matlab版本及参考文献
1 matlab版本 2014a
2 参考文献 [1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社，2020. [2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社，2013. [3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社，2013. [4]刘成龙.精通MATLAB图像处理[M].清华大学出版社，2015. [5]万谊丹.基于Arnold和DCT的抗剪切攻击图像水印研究[J].网络安全技术与应用. 2021,(08)
展开全文
• 基于小波变换的数字水印嵌入与提取_matlab代码，小波变换，水印嵌入，水印提取MATLAB亲测可用， 谢谢支持。
• 一、简介 1 DCT算法： DCT变换的全称是离散余弦变换(Discrete Cosine Transform)，离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换，这个离散...若对高频的数据做些修饰，再转回原来形式的数据时，显然原始
• 包含加密m文件，解密m文件，两个函数，都已搞好，数字内容安全作业
• 数字水印程序，包括多分辨嵌入水印、提取水印程序，盲水印嵌入提取程序，以及滤波攻击和JPEG攻击程序，PSNR和相似度计算公式（MATLAB）。

...

matlab 订阅