matlab写wav水印,如何利用matlab软件实现水印添加和提取

如何利用matlab软件实现水印添加和提取?

其实也很简单呀?

首先是按照你的嵌入规则来进行嵌入。提取的过程就是嵌入的逆过程

1:

size=256;

block=8;

blockno=size/block;%一行有32格

LENGTH=size*size/64;

Alpha1=0.025;

Alpha2=0.1;

T1=3;

I=zeros(size,size);%产生全矩阵

D=zeros(size,size);

BW=zeros(size,size);

Block_dct1=zeros(block,block);

%产生水印,并显示水印信息;

subplot(3,2,1);

Info='dcf';

InfoStrSize=length(Info);

%将字符串转换为位数组

array=zeros(1,InfoStrSize*8);

for m=1:InfoStrSize

Infochar=double(Info(m));  %% 'c'为99

for n=1:8

array(8*(m-1)+n)=bitget(Infochar,n);%%获得Infochar第n位的值

end

end

plot(array);

title('原始水印信息');

%显示原图

subplot(3,2,2);

i=imread('lena.bmp');

imshow(i,[]);

title('原始图像')

%显示prewitt为算子的边缘图

BW=edge(i,'prewitt');

%BW=edge(I,’Roberts’);

%BW=edge(I,’Sobel’);

%BW=edge(I,’zerocross’);

subplot(3,2,3);imshow(BW);

Title('原始图像边缘图');

%嵌入水印

l=1;

k=1;

for m=1:blockno

for n=1:blockno

x=(m-1)*block+1;   y=(n-1)*block+1;%算出每格图像的坐标(x,y),block=8,8*8的图像小格

block_dct1=i(x:x+block-1,y:y+block-1);%取原始图像小格中的像素点到block_dct1矩阵中。

block_dct1=dct2(block_dct1);%对二维数组进行离散余弦变换。dct是有损压缩如jpeg使用的技术。Dct是可逆的运算

BW_8_8=BW(x:x+block-1,y:y+block-1);%得到边界矩阵。

if m<=1|n<=1

T=0;

else

T=sum(BW_8_8);   T=sum(T);

end

if T>T1

Alpha=Alpha2;

%block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*mark(k));

if l<=(InfoStrSize*8)

block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*array(l));

l=l+1;

end

else

Alpha=Alpha1;

% block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*mark(k));

end

Block_dct=idct2(block_dct1);

D(x:x+block-1,y:y+block-1)=Block_dct;

k=k+1;

end

end

%显示嵌入水印后的图像

subplot(3,2,4);imshow(D,[]);title('嵌入水印图像')

%保存该图像

D=uint8(D);

imwrite(D,'marked.bmp');

2:

%提取水印

D=imread('marked.bmp');

D=double(D);

I=imread('lena.bmp');

I=double(I);

array2=zeros(1,InfoStrSize*8);

K=1;

l=1;

for m=1:blockno

for n=1:blockno

x=(m-1)*block+1;   y=(n-1)*block+1;%算出每格图像的坐标(x,y),block=8,8*8的图像小格

block_dct1=I(x:x+block-1,y:y+block-1);%取原始图像小格中的像素点到block_dct1矩阵中。

block_dct2=D(x:x+block-1,y:y+block-1);

Block_dct1=dct2(block_dct1);%对二维数组进行离散余弦变换。dct是有损压缩如jpeg使用的技术。Dct是可逆的运算

Block_dct2=dct2(block_dct2);

BW_8_8=BW(x:x+block-1,y:y+block-1);%得到边界矩阵。

if m<=1|n<=1

T=0;

else

T=sum(BW_8_8);   T=sum(T);

end

if T>T1

Alpha=Alpha2;

%block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*mark(k));

if l<=(InfoStrSize*8)

tmp=(Block_dct2(1,1)/Block_dct1(1,1)-1);

tmp=tmp/Alpha;

tmp2=round(tmp);

array2(l)=double(tmp2);

l=l+1;

end

else

Alpha= Alpha1;

%block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*mark(k));

end

k=k+1;

end

end

subplot(3,2,5);

plot(array2);

title('提取水印');

extractedInfo=zeros(InfoStrSize,1);

for m=1:InfoStrSize

infochar=0;

for n=1:8

if array2(8*(m-1)+n)==1

infochar=infochar+bitset(0,n,1);

end

end

extractedInfo(m)=infochar+extractedInfo(m);

end

resultStr=char(extractedInfo);

subplot(3,2,6);

plot(array2);

title(strcat('代表字符',resultStr))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值