clear;
close all;
M=imread('yin.jpg'); %读取水印图像
[rm,cm]=size(M);
I=imread('meizi.jpg'); %将图像矩阵转为double型
I=double(I)/255; %对矩阵计算处理要将其转化为double型,用unit8会溢出
[r,c]=size(I);
alpha=0.2;
k1=randn(1,8); %randn是均值为0方差为1的正态分布
k2=randn(1,8);
T=dctmtx(8); %产生二维DCT变换矩阵
%对图像分块
cda0=blkproc(I,[8 8],'P1*x*P2',T,T');
cda1=cda0;
for i=1:rm
for j=1:cm
x=(i-1)*8;y=(j-1)*8;
if M(i,j)==1
k=k1;
else
k=k2;
end
cda1(x+1,y+8)=cda0(x+1,y+8)+alpha*k(1);
cda1(x+2,y+7)=cda0(x+2,y+7)+alpha*k(2);
cda1(x+3,y+6)=cda0(x+3,y+6)+alpha*k(3);
cda1(x+4,y+5)=cda0(x+4,y+5)+alpha*k(4);
cda1(x+5,y+4)=cda0(x+5,y+4)+alpha*k(5);
cda1(x+6,y+3)=cda0(x+6,y+3)+alpha*k(6);
cda1(x+7,y+2)=cda0(x+7,y+2)+alpha*k(7);
cda1(x+8,y+1)=cda0(x+8,y+1)+alpha*k(8);
end
end
%嵌入水印后的图像
im_cover=blkproc(cda1,[8 8],'P1*x*P2',T',T);
%提取水印图像
dca1=blkproc(im_cover,[8 8],'P1*x*P2',T,T');
a=zeros(1,8);
for i=1:rm
for j=1:cm
x=(i-1)*8;y=(j-1)*8;
a(1)=dca1(x+1,y+8);
a(2)=dca1(x+2,y+7);
a(3)=dca1(x+3,y+6);
a(4)=dca1(x+4,y+5);
a(5)=dca1(x+5,y+4);
a(6)=dca1(x+6,y+3);
a(7)=dca1(x+7,y+2);
a(8)=dca1(x+8,y+1);
if corr2(a,k1)>corr2(a,k2)
mark(i,j)=1;
else
mark(i,j)=0;
end
end
end
figure;
subplot(221);imshow(I);
title('载体图像');
subplot(222);imshow(M);
title('原水印图像');
subplot(223);imshow(im_cover);
title('嵌入水印后图像');
subplot(224);imshow(mark);
title('提取的水印图像');
错误显示:
??? Subscripted assignment dimension mismatch.
Error in ==> blkproc at 89
aa(border(1)+(1:ma),border(2)+(1:na)) = a;
Error in ==> Untitled0 at 12
cda0=blkproc(I,[8 8],'P1*x*P2',T,T');
您好,谢谢回复。
程序我漏打了转成灰度的图像,实际上我有写,是的,错误还是如上的显示。
您能具体指出后面的错误吗?
如果您使用了灰度图像,上面的错误是不会显示的。
取而代之是下面的错误:
??? Attempted to access cda0(1,344); index out of bounds because size(cda0)=[223,337].
Error in ==> Digital_Watermark at 29
cda1(x+1,y+8)=cda0(x+1,y+8)+alpha*k(1);
这个错误是说您的第一个循环会超出矩阵cda1 cda0的范围
不是很明白为什么会出现这样的错误?
能给出修改的办法吗?
用matlab做数字水印嵌入和提取,结果提取出来的水印与原水印完全不同,难...
[a type]=myfunction(0.7,0);\/a嵌入强度,type攻击类型 x=imread('E:\\ori1.bmp');subplot(2,3,1);image(x);title('初始待加入水印图du像');w=imread('E:\\water1.bmp');subplot(2,3,2);imshow(w);title('待用水印图像');w=w\/255;[cA1,cH1,cV1,cD1]=dwt2(x,'haar');%...
MATLAB数字水印处理技术的实现
在MATLAB中,数字水印的实现通常涉及嵌入和提取过程。嵌入过程包括选取水印图像,对原始图像进行变换域处理(如离散余弦变换),将水印信息嵌入到特定位置(如DCT系数),然后进行逆变换和编码,以完成水印的嵌入。提取过程则通过反向操作,从水印嵌入的图像中恢复原始水印信息。实现数字水印处理时,MATLAB提供了...
matlab编程实现一种简单的数字水印嵌入与提取方法
DWT方法。原图大小为(512,512)嵌入图片大小为(64,64)嵌入:读取原图片。读取水印图片。原图片要处理为灰图。水印图片要处理为2值图。生成伪随机乱数(记住是怎么生成的,提取时用到)。随机乱数做成2值图K与水印图生成密钥WK的2值图(方法有很多种)。原图片做3次DWT处理(Matlab里函数是dwt2...
数字水印小波入门请教,万分感激!
在matlab中用DWT会出现A,B,C,D四个图。重要信息集中在A中,然后B,C,最后D。D中的信息很容易丢失,A中的信息中渐入水印会很明显,往往会迁入到B、C中,可以选择其中一个或者都嵌入。
matlab DWT数字水印程序
首先,不知道你会不会用Matlab。如果,你会用,应该有一个简单的DWT水印嵌入程序了。读取图片,DWT变换着都不用说了吧?有个不太明白的地方,就是,预处理是在什么时候做? 在原图片上做完后,在做DWT变换后嵌入?那么,这个字符串的信息量与原图信息量一样多。水印效果就。。。如果要嵌入,也要与...
Matlab DWT与SVD数字水印【解析 参考源码】
Matlab中的DWT(离散小波变换)与SVD(奇异值分解)在数字水印技术中扮演着关键角色。它们基于变换域的特性,提供了一种稳健的水印嵌入和提取策略。DCT(离散余弦变换)利用图像高频信息的集中性,而SVD的稳定性则确保了水印在图像扰动时的可靠性。在水印嵌入过程中,首先对图像进行DCT变换,然后选择SVD分解...
基于DCT算法的数字水印MATLAB程序报错错哪了
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里...
大一,计算机专业,将来想做数字音频方面的研究,比如数字水印。不过...
如果是数字水印,那么建议你,先从图像开始学习,图像有直观性,如果图像入手了,那么音频、视频,都可以实现数字水印。书籍呢。关于图像处理方面的书,很多的。比如VC++图像处理什么的。还有信号处理方面。特别是,傅里叶变换(DFT,FFT,DWT,DCT)算法即使不精通,也要熟悉。拿起来要会用。还有,关于编译...
求有关于数字水印图像中英对照文献,急用!谢谢!smallwoman@126.com 能...
不过仍可证明水印信息的存在。But still can prove the existence of watermark.可见,这种嵌入算法和提取算法可行,而且检测和抽取易于实现,从实验中还可以看出这种算法的尺度因子越大,其鲁棒性越好.实验结果表明我们完全可以通过数字水印技术避免数字产品被非法拷贝和复制,从而保护版权所有者的合法权益.一般...
matlab问题, Subscripted assignment dimension mismatch.
应该是你对blkproc这个函数的使用有误。由于你没有贴出这个函数的具体结构,所以没办法继续解答。自己检查一下吧