资源简介

基于二维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

评论

共有 条评论