DCT实现水印嵌入与提取(带攻击)

Posted Pam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DCT实现水印嵌入与提取(带攻击)相关的知识,希望对你有一定的参考价值。

问题:

想要用DCT技术,在Matlib上实现水印的隐藏和提取(带GUI界面),且加上一些攻击(噪声、旋转、裁剪),以及用NC值评判!

流程

选择载体

[filename,pathname]=uigetfile({\'*.bmp\';\'*.jpg\';\'*.*\'},\'选择图片\');%文件选择,这里可以选择可以打开的图片格式
str=[pathname filename];%被选择的文件路径
[handles.I,handles.map]=imread(str);%读取图片
zai=imread(str);
%zai=[handles.I,handles.map];
psnr_cover=double(zai);
guidata(hObject,handles);%图像串行化,保存在hObject,这样我整个页面都能取到handles的值
axes(handles.axes1);%把显示范围限定在axes1
imshow(zai,[]);%显示图片

选择要嵌入的水印

[filename,pathname]=uigetfile({\'*.bmp\';\'*.jpg\';\'*.*\'},\'选择图片\');%文件选择,这里可以选择可以打开的图片格式
str=[pathname filename];%被选择的文件路径
[handles.I,handles.map]=imread(str);%读取图片
%water=[handles.I,handles.map];
global water;
water=imread(str);
water=rgb2gray(water);
water=double(water)/255; 
water=ceil(water);
%guidata(hObject,handles);%图像串行化,保存在hObject,这样我整个页面都能取到handles的值
axes(handles.axes4);%把显示范围限定在axes4
imshow(water);%显示图片
dimI=size(water);
global rm;
global cm;
rm=dimI(1);cm=dimI(2);

嵌入

start_time=cputime;
global water;
global rm;
global cm;
cda0=blkproc(handles.I,[8,8],\'dct2\');
mark=water;
alpha=10;
global k1;
global k2;
k1=randn(1,8);
k2=randn(1,8);
[r,c]=size(handles.I);
cda1=cda0;   % cda1 = 256_256
for i=1:rm  % i=1:32
    for j=1:cm  % j=1:32
        x=(i-1)*8;y=(j-1)*8;
        if mark(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
global a1;
a1=blkproc(cda1,[8,8],\'idct2\');
a_1=uint8(a1);

axes(handles.axes5);%把显示范围限定在axes5s
imshow(a_1);%显示图片
%imwrite(a_1,\'嵌入水印后的图.bmp\',\'bmp\');
%subplot(2,3,3),imshow(a1,[]),title(\'嵌入水印后的图像\');
%disp(\'嵌入水印处理时间\')
embed_time=cputime-start_time
set(handles.text13,\'string\',num2str(embed_time));
p0=a_1;

攻击

1、白噪声攻击

gong=a1;
noise0=1*randn(size(gong));
gong=uint8(gong+noise0);

2、椒盐噪声

gong=imnoise(uint8(a1), \'salt & pepper\', 0.01);%添加密度为0.01的椒盐噪声

3、旋转

gong=uint8(imrotate(uint8(a1),30,\'nearest\',\'crop\'));

4、裁剪

%原图进行分色并剪切
gong=a1;
I_r= gong(:,:,1);
I_r(1:128,1:128)=255;
%三色通道合并
gong(:,:,1) = I_r;
gong=uint8(gong);

提取

global k1;
global gong;
global k2;
global water;
dimI=size(water);

psnr_watermarked=double(gong);
dca1=blkproc(gong,[8,8],\'dct2\');
p=zeros(1,8);
for i=1:dimI(1) %行
    for j=1:dimI(2)  % j=1:32列
        x=(i-1)*8;y=(j-1)*8;
        p(1)=dca1(x+1,y+8);
        p(2)=dca1(x+2,y+7);
        p(3)=dca1(x+3,y+6);
        p(4)=dca1(x+4,y+5);
        p(5)=dca1(x+5,y+4);
        p(6)=dca1(x+6,y+3);
        p(7)=dca1(x+7,y+2);
        p(8)=dca1(x+8,y+1);
        if corr2(p,k1)>corr2(p,k2),warning off MATLAB:divideByZero;
            mark1(i,j)=1;
        else
            mark1(i,j)=0;
        end
    end
end
axes(handles.axes7);%把显示范围限定在axes5s
imshow(mark1);%显示图片
embed_time=cputime-start_time;
set(handles.text14,\'string\',num2str(embed_time));

NC=nc(mark1,water)  %调用nc.m子函数
set(handles.text15,\'string\',num2str(NC));

结果

源程序见github

参考

1、数字水印常见攻击类型汇总,噪声,缩放,旋转,剪切(附matlab代码)

 

以上是关于DCT实现水印嵌入与提取(带攻击)的主要内容,如果未能解决你的问题,请参考以下文章

水印攻击信息提取基于盲带矩阵DWT变换和DCT变换数字水印嵌入和水印攻击之后的图像信息提取解析matlab仿真(包括噪声攻击,旋转攻击以及压缩攻击)

DCT水印嵌入与提取_(Python Version)

图像隐写基于matlab GUI DCT+FFT数字水印嵌入+攻击+提取(带面板)含Matlab源码 1760期

图像隐写基于matlab GUI DWT+DCT+SVD数字水印嵌入+提取+攻击(带面板)含Matlab源码 1664期

Matlab系列基于DCT和置乱算法的视频水印Matlab实现

图像隐写基于matlab DCT数字水印嵌入+攻击+提取含Matlab源码 1758期