实验8-基于DCT的数字水印隐藏及攻击提取技术

  • 实验题目(此栏实验前由老师填写)

一、基于DCT的数字水印图像隐藏实现

1、参考所附代码,读取一个RGB图‘baboon.png’,取得该图的R分量。

(注意观察尺寸大小)

 P=imread(baboon.png'); %载入图片
figure;
R1=P;
R1(:,:,2)=0;R1(:,:,3)=0;
%保存图像
R1= imresize(R1,[64 64]);
imwrite(R1,'baboonR1.png','png');
% 显示图像
subplot(1,1,1);imshow(R1,[]);title('R通道');

2、对该 R分量进行DCT变量;

3、读取“huawei.png(或者du.png,或者kgy.jpg)” ,变换为灰度图,尺寸大小设置为64x64(即前一图像的尺寸/8的大小)。

保存为”mark.bmp”.

 X=imread('huwei.png');%读入RGB图像
I=rgb2gray(X);%进行灰度变化
set(0,'defaultFigurePosition',[100,100,1000,500]);%设置显示图像的窗口大小
set(0,'defaultFigureColor',[0 0 0]);%设置显示的背景颜色
subplot(121),imshow(X);%显示读入的图像
subplot(122),imshow(I);%显示进行灰度变化后的图像
I = imresize(I,[64 64]);
imwrite(I,'mark.bmp')
imfinfo('mark.bmp')

4、参考所给代码,设置嵌入因子为0.1,对mark.bmp进行DCT变换。

5.参考所给代码,把mark.bmp嵌入到R分量中。

6、嵌入后的图像进行DCT逆变换,并保存为withmark.bmp。

7、显示该图像。

% The watermark image is embedded into the color image by DCT transformation 
% 将水印图像做DCT变换嵌入到彩色图像中 
clc;
clear all;
wtype = 'dct2';
iwtype = 'idct2';
originalImage=imread('lenna.bmp');
alpha=0.1;    % Embedded factor       嵌入因子 
dim_i=size(originalImage);
rm=dim_i(1);
cm=dim_i(2);
% Embedding formula         设嵌入公式v‘=v(1+aXk)中的a=0.1
% Display carrier image          显示原始图片
subplot(2,2,1);
imshow(originalImage);title('Original Image');

% Read and display watermark images  水印图片
watermark=imread('mark.bmp');
%watermark = rgb2gray(watermark);
subplot(2,2,2);
imshow(watermark);title('Watermark Image'); 
% DCT transform of watermark image      对水印图片做DCT变换
watermark_dct=blkproc(watermark,[8,8],wtype);
waterseria=watermark_dct(:);  % 列向量
% Extract green channel     提取绿色分量
image=imread('lenna.bmp'); % 重新读取一次原始图像,为了分离和复原颜色通道更方便。
image_g=image(:,:,1);
% DCT transformed for green channel   对绿色分量进行DCT变换
dct_image_g=blkproc(image_g,[8,8],wtype);   
dct_image1=dct_image_g;

k=1;
for i=1:rm/8
    for j=1:cm/8
        x=(i-1)*8;y=(j-1)*8;
        ave=(dct_image_g(x+3,y+5)+dct_image_g(x+5,y+5)+dct_image_g(x+4,y+4)+dct_image_g(x+4,y+6)+dct_image_g(x+2,y+7))/5;
        dct_image1(x+4,y+5)=ave+alpha*waterseria(k);
        k=k+1;
    end
end
image2=blkproc(dct_image1,[8,8],iwtype);  % 反DCT变换
%将嵌入水印的绿色分量加到原图中
image(:,:,1)=image2;

% 计算PSNR
PSNR=psnr(image_g,image2);

image = uint8(image);
%加水印之后的图片
subplot(2,2,3);
imshow(image)
name='嵌入水印图像';
title(strcat(num2str(name),'k=',num2str(alpha),'PSNR=',num2str(PSNR)));
imwrite(image,'withmark.bmp','bmp');

二、参考所给代码,从withmark.bmp中提取嵌入的水印图像。

% 水印提取
%提取绿色分量
outpicture = imread('withmark.bmp');
out_image=outpicture(:,:,1);  %提取绿色分量
[rm,cm]=size(out_image);
%水印提取过程
outdct_image=blkproc(out_image,[8,8],wtype);  %dct变换 
%提取频谱
k=1;
for i=1:rm/8
    for j=1:cm/8
        x=(i-1)*8;y=(j-1)*8;
        ave=(outdct_image(x+3,y+5)+outdct_image(x+5,y+5)+outdct_image(x+4,y+4)+outdct_image(x+4,y+6)+outdct_image(x+2,y+7))/5;
        outwaterseria(k)=(outdct_image(x+4,y+5)-ave)/alpha;
        k=k+1;
    end
end

k=1;
for i=1:rm/8
    for j=1:cm/8
        outwatermark_dct(j,i)=outwaterseria(k);
        k=k+1;
    end 
end
outwatermark=blkproc(outwatermark_dct,[8,8],iwtype);
outwatermark = uint8(outwatermark);

subplot(2,2,4);
imshow(outwatermark);

三、根据参考代码,对withmark.bmp进行破坏:加白噪声、高斯低通过滤、剪切、旋转。并分别保存。

% 进行攻击测试  %
wimage=imread('withmark.bmp');
wimage=double(wimage);
disp('1-->加白噪声');
disp('2-->低通过滤');
disp('3-->剪切');
disp('4-->旋转');
disp('5-->未攻击');
begin=input('输入选择?1-5 ');
switch begin
        % 加入白噪声 ? 
    case 1
Aimage1=wimage;
        Wnoise=20*randn(size(Aimage1));
        Aimage1=Aimage1+Wnoise;
        subplot(2,3,4),imshow(Aimage1,[]),title('加入白噪声后的图象');
        att=Aimage1;
        imwrite(att,'whitenoiseimage.bmp');
        % 高斯低通滤波
case 2
        Aimage2=wimage;
        H=fspecial('gaussian',[4,4],0.5);
        Aimage2=imfilter(Aimage2,H);
        subplot(2,3,4),imshow(Aimage2,[]),title('高斯低通滤波后的图象');
        att=Aimage2;
        imwrite(att,'gaussianimage.bmp')
        % 剪切攻击

case 3
        Aimage3=wimage;
        Aimage3(1:128,1:128)=256;
        subplot(2,3,4),imshow(Aimage3,[]),title('剪切后的图象');
        att=Aimage3;
        imwrite(att,'cutpartimage.bmp');
        % 旋转攻击

case 4
        Aimage4=wimage;
        Aimage4=imrotate(Aimage4,0.55,'bilinear','crop');
        Aimage_4=mat2gray(Aimage4);
        subplot(2,3,4),imshow(Aimage_4,[]),title('旋转10 度后的图象');
        att=Aimage_4;
        imwrite(att,'rotatedimage.bmp');
        % 没有受到攻击 
    case 5
        subplot(2,3,4),imshow(wimage,[]),title('直接提取的图像');
        att=wimage;
        imwrite(att,'directimage.bmp');
end

四、分别对破坏后的图像进行水印提取

(***)五、 对基于LSB 的载密图像进行攻击检测

1、创建文本文件secure01.txt,保存你的学号及姓名全拼

2、在所给的图像中任选一个(RGB要转换为灰度图),参考补充文档中的代码,使用LSB隐藏技术,把secure01.txt隐藏到图像中去(顺序或随机都可以),并保存隐藏后的图像(自行命名)。

3、显示隐藏前后的图像。

4、提取隐藏的信息,保存为secure02.txt.显示文件内容。

5、对载密图像进行破坏:缩放或压缩。

6、计算破坏后隐藏的信息与原信息相比的误码率。

你可能感兴趣的:(计算机视觉,人工智能)