資源簡介
基于二維DCT的自適應水印算法matlab實現參考源代碼,根據圖像塊所包含的邊緣信息的多少自適應嵌入不同的強度.

代碼片段和文件信息
M=256;??%原圖256x256
N=32; %水印32x32同時256/8=32
K=8;????%原圖按8x8分塊
I=zeros(MM);
EI=zeros(MM); %保存原圖的邊界圖
J=zeros(NN);
BLOCK=zeros(KK);
Alpha1=0.1;
Alpha2=0.03;
T1=3;
subplot(321);
I=imread(‘original.bmp‘);
imshow(I);
title(‘原圖‘);
EI=edge(I‘prewitt‘);
subplot(322);
imshow(EI);
title(‘原圖邊界‘);
subplot(323);
J=imread(‘originalWater.bmp‘);
imshow(J);
title(‘水印‘);
%%%%%%%??分塊DCT變換 %%%%%%%
for?p=1:N %256/8
????for?q=1:N
????????x=(p-1)*K+1; %每個小塊左上角的點
????????y=(q-1)*K+1;
????????BLOCK=I(x:x+K-1y:y+K-1); %取每個小塊相應元素保存到BLOCK
????????BLOCK=dct2(BLOCK); %二維離散余弦變換
EIBlock=EI(x:x+K-1?y:y+K-1);
????????%% 嵌入水印反DCT變換
????????T=sum(sum(EIBlock));
if?T>T1
Alpha=Alpha1;
else
Alpha=Alpha2;
????????end
????????if?J(pq)==0
????????????a=-1;
????????else
????????????a=1;
????????end
????????BLOCK=BLOCK*(1+a*Alpha);
????????BLOCK=idct2(BLOCK); %反二維離散余弦變換
????????I(x:x+K-1y:y+K-1)=BLOCK;
????end
end
subplot(324);
imshow(I);
title(‘嵌入水印后的圖像‘);
imwrite(I‘marked.bmp‘);
%%%%%??提取水印??%%%%%
I=imread(‘original.bmp‘); %原圖
P=imread(‘marked.bmp‘); %嵌入水印的圖像
%提取水印算法
for?p=1:N
????for?q=1:N
????????x=(p-1)*K+1;
????????y=(q-1)*K+1;
????????BLOCK1=I(x:x+K-1y:y+K-1);
????????BLOCK1=idct2(BLOCK1);
????????BLOCK2=P(x:x+K-1y:y+K-1);
????????BLOCK2=idct2(BLOCK2);
????????a=BLOCK2(11)/BLOCK1(11)-1;
????????if?a<0
W(pq)=0;
????????else
????????????W(pq)=1;
????????end
????end
end
subplot(325);
imshow(W);
title(‘提取的水印‘);
imwrite(W‘waterPrint2.bmp‘);
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????66614??2018-06-20?17:59??original.bmp
?????文件?????????190??2018-06-20?17:47??originalWater.bmp
?????文件????????1676??2018-06-20?18:03??self_adopt_dct.m
- 上一篇:rls算法自適應均衡器matlab實現
- 下一篇:高斯窗的短時傅里葉變換變換程序
評論
共有 條評論