1.想找到一些关于基于DCT变换域的数字水印算法的资料
较早利用分块DCT的水印技术是Koch .E、Zhao.J的文章[1],他们的水印方案是用一个密钥随机的选择图像的一些分块,在频域的中频上稍稍改变一个三元组来隐藏二进制序列信息。这种方法对有损压缩和低通滤波是稳健的。Cox等[2]提出了著名的基于图像全局变换的数字水印技术,该方案对整个图像作离散余弦变换(DCT),然后将水印嵌入到预先设定的低频分量中,水印信号由高斯分布的实数序列组成,算法不仅在视觉上具有不可察觉性,而且稳健性也非常好,可经受JPEG压缩、滤波、剪切等攻击。Barni等[3]提出一种利用HVS掩蔽特性的基于DCT的水印算法,在水印嵌入阶段,对 的图像进行 的DCT变换,对DCT系数按Zig-Zag扫描重新排列为一维向量,留下向量中开始的L个系数不作修改,对第L个系数后面的M个系数进行修改以嵌入水印。黄继武等人[4] 在对DCT系数DC和AC分量的定性和定量分析的基础上,指出DC分量比AC分量更适合嵌入水印,嵌入DC分量的水印具有更好的稳健性,并提出了一个利用DC分量的自适应算法。
以上算法至少有以下两个缺点:①在水印提取过程中使用了原始图像,这一点在实时的网络环境中很难做到;②只能给出水印存在有无的回答,在许多应用场合要求水印是有意义的,如一个二维图像(商标、印鉴等)。显然,这种有意义的水印所包含的信息量、可感知性、可辩识性及保密性,是无意义的伪随机噪声所不能比拟的。
本文在研究了前人算法的基础上,提出了一个利用块分类的DCT域自适应扩频图像水印算法,嵌入的水印是一个可视二值图像。用两个不相关的伪随机序列分别代表水印信息中的0和1,从而达到扩频的目的,将扩频后的水印信号,嵌入到分块DCT域的中低频段系数中。在嵌人过程中充分考虑到了局部图像的复杂度,能够自适应地调整嵌人强度,水印检测算法不需要原始图像,实现了盲检测。仿真实验表明:图像经过JPEG有损压缩、低通与中值滤波、剪切等图像处理操作后仍是稳健的。
2.谁有DCT算法,数字水印提取和嵌入的程序
M=256;%原图像长度
N=32;%水印图像长度
K=8; %图像分块大小
I=zeros(M,M);%创建一个零矩阵,用于存放载体图像
J=zeros(N,N); %创建一个零矩阵,用于存放水印图像
BLOCK=zeros(K,K);%创建一个零矩阵,用于存放图像分块
%显示水印图像
subplot(1,8,2);
J=imread('14','bmp'); %读入水印图像
imshow(J); %显示水印图像
title('水印图像');
%显示原图像
subplot(1,3,2);
I=imread('11','bmp'); %读入原始图像
imshow(I); %显示原始图像
title('原始公开图像');
%嵌入水印
tem=1;%创建变量tem,没用
for p=1:N%水印图像行循环
for q=1:N%水印图像列循环
x=(p-1)*K+1; %x为载体图像行坐标
y=(q-1)*K+1; %y为载体图像列坐标
BLOCK=I(x:x+K-1,y:y+K-1); %BLOCK为载体图像I的分块,分块大小为K*K,
%初始值为I(0:K-1,0:K-1)
BLOCK=dct2(BLOCK);%对BLOCK进行二维DCT变换,得到新的BLOCK即%DCT系数矩阵BLOCK
if J(p,q)==0%如果水印图像的第(p,q)个像素为0
a=-1;%嵌入参数为-1
else
a=1; %若如果水印图像的第(p,q)个像素为1嵌入参数为1
end
BLOCK(2,1)=BLOCK(2,1)*(1+a*0.01); %对载体图像的分块的DCT系数矩阵
%BLOCK
BLOCK=idct2(BLOCK);%对DCT系数矩阵进行反变换,得到嵌入水印后的载体
%图像分块BLOCK
I(x:x+K-1,y:y+K-1)=BLOCK;%用嵌入水印后的图像分块BLOCK代替载体图像
%的对应分块
End%水印图像列循环结束
End%水印图像行循环结束
%显示嵌入水印后的图像
subplot(1,3,3);
imshow(I);%显示嵌入水印后图像
title('嵌入水印后的图像');
imwrite(I,'embedded.bmp','bmp');%将嵌入水印后图像写成bmp文件
够详细吧,希望对你有用。
3.基于DCT算法的数字水印MATLAB程序报错错哪了
for m=1:N
for n=1:N
x=(m-1)*K+1;
y=(n-1)*K+1;
II=I(x:x+K-1,y:y+K-1);%将原图分成8*8的子块
Idct=dct2(II);%对子块进行DCT变换
if x==1&y==1
alfa=0.002;
else
alfa=0;
for里面是错的,这个程序在好几年前就看到了,还在用。
matlab运算便捷了很多,最好matlab里面不要用for,因为matlab本身就有很多for模块,所以在matlab里面用for会大大的降低速度。还有,matlab有严格的矩阵运算格式,要注意矩阵运算方法。
8*8DCT很难吗?给你一个提示,
都是matlab里面基的东西
i=1:10;%答案是
1 2 3 4 5 6 7 8 9 10
i=1:2:10;%答案是
1 3 5 7 9
i=1:8:256;
这答案是什么呢?
矩阵该如何运算呢?
解决这个问题,你的答案也就出来了很简单的。
4.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就可以了
5.你好啊,请问你的基于DCT的音频数字水印的水印嵌入代码可以给我看
%水印嵌入*********************************************************************************************(1)
%1同步信号,在音频起始点嵌入10个幅值相同的点
[x,fs,nbits]=wavread('E:\wave1\0000.wav');
lenx=length(x);
w=wavread('E:\wave1\0001.wav');
y=[0.02; 0.02 ;0.02; 0.02 ;0.02; 0.02 ;0.02; 0.02 ;0.02 ;0.02];
%input m
m=1000;
k=fix(lenx/10/m)*10;
w1=w(1:m);
%input a
a=50;
%2分段处理,
for i=1:k:m*k
%3离散余弦变换
x1=dct(x(i:i+k-1));
%排序找出中频系数mid 用公式mid'=mid(1+a*w)
[x11,index]=sort(x1);
j=fix(i/k)+1;
for t=1:3
%4修改中频系数
x1(index(t+1))=x11(t+1)*(1+a*w(j));
%纪录被改变的系数和序号
recordx(j,t)=x11(t+1);
recordi(j,t)=index(t+1);
%5离散余弦逆变换
x(i:i+k-1)=idct(x1);
end
end
%6合并得到嵌入水印后的音频信号
x=[y;x];
%将嵌入水印后的音频信号保存
wavwrite(x,fs,nbits,'E:\wave1\00000.wav');
%水印提取*********************************************************************************************(2)
%1同步检测
[x2,fs,nbits]=wavread('E:\wave1\00000.wav');
lenxx=length(x2)-m*k;
i=1;
%input b
b=0.001;
while and(or(or(abs(x2(i)-0.02)>b,abs(x2(i+1)-0.02)>b),abs(x2(i+2)-0.02)>b),i<lenxx)
i=i+1;
end
while and(abs(x2(i+3)-0.02)<b, i<=lenxx)
i=i+1;
end
%判断是否有同步检测信号
if i>lenxx
error('没有同步检测信号 ');
end
%2含有水印的音频信号做分段处理
x3=x2((i+3):(i+2+m*k));
length(x3)
%3原始音频信号做分段处理
for i=1:k:m*k
%4含有水印的音频信号做离散余弦变换
x4=dct(x3(i:i+k-1));
j=fix(i/k)+1;
%5水印提取
w21=(x4(recordi(j,1))/recordx(j,1)-1)/a;
w22=(x4(recordi(j,2))/recordx(j,2)-1)/a;
w23=(x4(recordi(j,3))/recordx(j,3)-1)/a;
w2(j)=(w21+w22+w23)/3;
end
%6求相关系数
cox1=(w1'*w2')/(norm(w1)*norm(w2))
%水印攻击*********************************************************************************************(3)