一、基于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、计算破坏后隐藏的信息与原信息相比的误码率。