- 实验题目(此栏实验前由老师填写)
第一部分:综合复习
一、读取图片“house.png”,将其每个像素的最低2位清0,保存为”house01.png”并显示该图片(标题注明为你的姓名全拼)。
clc;
A=imread('house.png');
[h,w]=size(A);
for i=1:h
for j=1:w
B(i,j)=bitand(A(i,j), 252);
end
end
imwrite(B,'house01.png');
imshow(B,[]);
title('luruohan');
二、读取图片“house.png”,将其每个像素的最高2位清0,保存为”house02.png”并显示该图片(标题注明为你的姓名全拼)。
clc;
A=imread('house.png');
[h,w]=size(A);
for i=1:h
for j=1:w
B(i,j)=bitand(A(i,j), 63);
end
end
imwrite(B,'house01.png');
imshow(B,[]);
title('luruohan');
三、读取一幅RGB图像“baboon.bmp”,分别提取R、G、B颜色分量,
将每个颜色分量最低位清0,再合成为RGB图像,保存为“baboon01.bmp”,并显示该图像(标题注明为你的姓名全拼)。
clc;
A=imread('baboon.bmp');
Ar=A(:,:,1);
Ag=A(:,:,2);
Ab=A(:,:,3);
[h,w]=size(Ar);
for i=1:h
for j=1:w
Ar(i,j)=bitand(Ar(i,j),254);
Ag(i,j)=bitand(Ag(i,j),254);
Ab(i,j)=bitand(Ab(i,j),254);
end
end
B(:,:,1)=Ar;
B(:,:,2)=Ag;
B(:,:,3)=Ab;
imwrite(B,'baboon01.bmp');
imshow(B,[]);
title('luruohan');
四、读取一幅RGB图像“baboon.bmp”,提取R(或G、B)颜色分量,
将该颜色分量最低4位清0,再与其它分量合成为RGB图像,保存为“baboon02.bmp”,并显示该图像(标题注明为你的姓名全拼)。
clc;
A=imread('baboon.bmp');
Ar=A(:,:,1);
Ag=A(:,:,2);
Ab=A(:,:,3);
[h,w]=size(Ar);
for i=1:h
for j=1:w
Ar(i,j)=bitand(Ar(i,j),240);
end
end
B(:,:,1)=Ar;
B(:,:,2)=Ag;
B(:,:,3)=Ab;
imwrite(B,'baboon02.bmp');
imshow(B,[]);
title('luruohan');
五、LSB隐藏(顺序隐藏)
1、读取“house.png”图像,使用LSB方法,将sec.txt中信息(你的姓名全拼及学号)隐藏到该图像中。并保存为“house01.png”,显示该图像(标题注明为你的姓名全拼)。
cover = imread('house.png') ;
ste_cover = cover;
ste_cover=double(ste_cover);
f_id = fopen('sec.txt', 'r') ;
[ msg, len_total] = fread( f_id, 'ubit1');
[ m, n] = size( ste_cover) ;
if len_total > m*n
error( '嵌入的信息量太大') ;
end
p = 1;
for f2 = 1:n
for f1 = 1:m
%ste_cover( f1, f2) = ste_cover( f1, f2) -mod( ste_cover( f1, f2) , 2) + msg( p, 1) ;
ste_cover( f1, f2) = bitand(ste_cover( f1, f2), 254) ;
ste_cover( f1, f2) = ste_cover( f1, f2) + msg( p, 1) ;
if p == len_total
break;
end
p = p + 1;
end
end
ste_cover = uint8( ste_cover) ; %生成隐密后的图像;
imwrite( ste_cover, 'houses01.png') ; %显示隐藏结果;
subplot( 1, 2, 1) ; imshow( cover) ; title( '原始图像') ;
subplot( 1, 2, 2) ; imshow( 'houses01.png') ; title( '隐藏信息后的图像');
2、读取“house01.png”图像,提取其中隐藏的信息,保存到sec01.txt文件中。显示其中的内容。
ste_cover=imread('houses01.png');
ste_cover=double(ste_cover);
%判断嵌入消息量是否过大
[m,n]=size(ste_cover);
frr=fopen('sec01.txt','w');
%p作为消息嵌入位数计数器,将消息序列写回文本文件
p=1;
for f2=1:n
for f1=1:m
if bitand(ste_cover(f1,f2),1)==1
fwrite(frr,1,'ubit1');
result(p,1)=1;
else
fwrite(frr,0,'ubit1');
result(p,1)=0;
end
if p==len_total
break;
end
p=p+1;
end
end
fclose(frr);
六、LSB隐藏(顺序隐藏)
1、读取“baboon.bmp”图像,使用LSB方法,将sec.txt中信息(你的姓名全拼及学号)隐藏到该图像R分量中。再与其它分量合成,并保存为“baboonr.bmp”,显示该图像(标题注明为你的姓名全拼)。
cover = imread('baboon.bmp') ;
ste_cover = cover(:,:,2);
ste_cover=double(ste_cover);
f_id = fopen('sec01.txt', 'r') ;
[ msg, len_total] = fread( f_id, 'ubit1');
[ m, n] = size( ste_cover) ;
if len_total > m*n
error( '嵌入的信息量太大') ;
end
p = 1;
for f2 = 1:n
for f1 = 1:m
%ste_cover( f1, f2) = ste_cover( f1, f2) -mod( ste_cover( f1, f2) , 2) + msg( p, 1) ;
ste_cover( f1, f2) = bitand(ste_cover( f1, f2), 254) ;
ste_cover( f1, f2) = ste_cover( f1, f2) + msg( p, 1) ;
if p == len_total
break;
end
p = p + 1;
end
end
ste_cover = uint8( ste_cover) ; %生成隐密后的图像;
cover(:,:,2)=ste_cover;
imwrite( cover, 'baboonr.bmp') ; %显示隐藏结果;
subplot( 1, 2, 1) ; imshow( 'baboon.bmp') ; title( '原始图像') ;
subplot( 1, 2, 2) ; imshow( 'baboonr.bmp') ; title( 'luruohan');
2、读取“baboonr.bmp”图像,提取R分量,再提取其中隐藏的信息,保存到sec01.txt文件中。显示其中的内容。
cover = imread('baboon.bmp') ;
ste_cover = cover(:,:,2);
ste_cover=double(ste_cover);
f_id = fopen('sec01.txt', 'r') ;
[ msg, len_total] = fread( f_id, 'ubit1');
[ m, n] = size( ste_cover) ;
if len_total > m*n
error( '嵌入的信息量太大') ;
end
p = 1;
for f2 = 1:n
for f1 = 1:m
%ste_cover( f1, f2) = ste_cover( f1, f2) -mod( ste_cover( f1, f2) , 2) + msg( p, 1) ;
ste_cover( f1, f2) = bitand(ste_cover( f1, f2), 254) ;
ste_cover( f1, f2) = ste_cover( f1, f2) + msg( p, 1) ;
if p == len_total
break;
end
p = p + 1;
end
end
ste_cover = uint8( ste_cover) ; %生成隐密后的图像;
cover(:,:,2)=ste_cover;
imwrite( cover, 'baboonr.bmp') ; %显示隐藏结果;
subplot( 1, 2, 1) ; imshow( 'baboon.bmp') ; title( '原始图像') ;
subplot( 1, 2, 2) ; imshow( 'baboonr.bmp') ; title( 'luruohan');
七、DCT隐藏(顺序隐藏)
1、读取“house.png”图像,使用DCT方法,将sec.txt中信息(你的姓名全拼及学号)隐藏到该图像中。并保存为“housedct.png”,显示该图像(标题注明为你的姓名全拼)。
%文件名:hidedctadv.m
alpha=0.1;
frr=fopen('sec.txt','r');
[msg,count]=fread(frr,'ubit1');
fclose(frr);
data0=imread('house.png');
%将图象矩阵转为double型
data0=double(data0)/255;
%取图象的一层做隐藏
%对图象分块
T=dctmtx(8);
%对分块图象做DCT变换
DCTrgb=blkproc(data0,[8 8],'P1*x*P2',T,T');
DCTrgb0=DCTrgb;
[row,col]=size(DCTrgb);
%[k1,k2]=randinterval(a,count,key);
%信息嵌入
temp=0;
k=1;
for i=1:row/8
for j=1:col/8
x=(i-1)*8+1;y=(j-1)*8+1;
if msg(k,1)==0
if DCTrgb(x+4,y+1)>DCTrgb(x+3,y+2)
temp=DCTrgb(x+4,y+1);
DCTrgb(x+4,y+1)=DCTrgb(x+3,y+2);
DCTrgb(x+3,y+2)=temp;
end
else
if DCTrgb(x+4,y+1)<=DCTrgb(x+3,y+2)
temp=DCTrgb(x+4,y+1);
DCTrgb(x+4,y+1)=DCTrgb(x+3,y+2);
DCTrgb(x+3,y+2)=temp;
end
end
if DCTrgb(x+4,y+1)>DCTrgb(x+3,y+2)
DCTrgb(x+3,y+2)=DCTrgb(x+3,y+2)-alpha;%将原本小的系数调整得更小
else
DCTrgb(x+4,y+1)=DCTrgb(x+4,y+1)-alpha;
end
if k==count
break;
end
k=k+1;
end
end
%信息写回保存
DCTrgb1=DCTrgb;
data=blkproc(DCTrgb,[8 8],'P1*x*P2',T',T);
result=data;
imwrite(result,'housedct.png');
imshow(result,[]);
title('luruohan')
2、读取“housedct.png”图像,提取其中隐藏的信息,保存到sec01.txt文件中。显示其中的内容。
%函数功能:本函数用于DCT隐藏信息的提取
data0=imread('housedct.png');
data0=double(data0)/255;
[row,col]=size(data0);
%分块做DCT变换
T=dctmtx(8);
DCTcheck=blkproc(data0,[8 8],'P1*x*P2',T,T');
%准备提取并回写信息
frr=fopen('sec02.txt','w');
k=1;
for i=1:row/8
for j=1:col/8
x=(i-1)*8+1;y=(j-1)*8+1;
if DCTcheck(x+4,y+1)<=DCTcheck(x+3,y+2)
fwrite(frr,0,'ubit1');
else
fwrite(frr,1,'ubit1');
end
if k==112
break;
end
k=k+1;
end
end
fclose(frr);
八、4bit替换法
1、读取“kgy.jpg”转变为灰度图,再采用4bit替换法将其隐藏到“lena.bmp”中,保存为“pepper01.bmp”显示该图像(标题注明为你的姓名全拼)。
2、读取“pepper01.bmp”,提取其中隐藏的图像,显示该图像(标题注明为你的姓名全拼)。
% 提取图像信息并分层
cover = imread('lenna.bmp') ;
cover1= cover(:,:,1);
[row, col] = size(cover1) ;
RGB = imread('kgy.jpg');
msg=(rgb2gray(RGB));
%修改图片大小
msg=imresize(msg,[row,col]);
% 置载体图像 R 层的低 4bit 为 0
for i = 1:row
for j = 1:col
cover1( i, j) = bitand( cover1( i, j) , 240) ;
end
end
% 置秘密图像的低 4bit 为 0
takemsg4 = bitand( msg, 240) ;
% 将秘密图像的高 4bit 右移 4 位
shiftmsg4 = bitshift( takemsg4, - 4) ;
% 图像隐藏
for i = 1:row
for j = 1:col
cover1( i, j) = bitor( cover1( i, j) , shiftmsg4( i, j) ) ;
end
end
% 写回并保存
cover(:,:, 1) = cover1;
imwrite( cover, 'pepper01.bmp') ;
%以下为提取代码,可单独分离为一个脚本
data = imread('pepper01.bmp') ;
A = data(:,:,1) ;
[ row, col] = size( A) ;
for i = 1:row
for j = 1:col
A( i, j) = bitand( A( i, j) , 15) ;
end
end
A = bitshift( A, 4) ;
% 显示结果
subplot( 221) , imshow( 'lenna.bmp') ; title( '载体图像');
subplot( 222) , imshow( msg) ; title( '秘密图像');
subplot( 223) , imshow( data) ; title( '载密图像luruohan');
imwrite(A,'pepper01.bmp');
subplot( 224) , imshow( A) ; title( '提取的密秘图像luruohan');
九、基于LSB的水印嵌入
编写脚本程序,使用LSB方法把一张图像嵌入到另一个图像中去。
(注意:需要进行图像的二值化操作)。
再编写脚本程序把隐藏的水印提取出来。
Cimg=rgb2gray(imread('C:\Users\S3214\Desktop\pic-9\baboon.png'));
[M,N]=size(Cimg);
figure,imshow(Cimg);
title('载体图像');
imwrite(Cimg,'C:\Users\S3214\Desktop\InputImg.png');
BinImg=rgb2gray(imread('C:\Users\S3214\Desktop\pic-9\huwei.png'));
[m,n]=size(BinImg);
if m>M || n>N
BinImg=imresize(BinImg,[M,N]);
end
BinImg=im2double(BinImg);
BinImg=imbinarize(BinImg,0.50);
figure,imshow(BinImg);
title('需要被隐藏的二值图像');
imwrite(BinImg,'C:\Users\S3214\Desktop\mark1.png');
if(m<=M && n<=N)
for i=1:m
for j=1:n
if BinImg(i,j) == bitget(Cimg(i,j),1)
continue;
elseif BinImg(i,j) == 0 && bitget(Cimg(i,j),1) == 1
Cimg(i,j)=Cimg(i,j)-1;
elseif BinImg(i,j) == 1 && bitget(Cimg(i,j),1) == 0
Cimg(i,j)=Cimg(i,j)+1;
end
end
end
else
fprintf('BinImg is too big than Cimg!!!');
end
imshow(Cimg);
imwrite(Cimg,'C:\Users\S3214\Desktop\outputwatermark1.png');
十、基于DCT的数字水印图像隐藏实现
1、读取一个RGB图‘baboon.png’,取得该图的R分量。
(注意观察尺寸大小)
2、对该 R分量进行DCT变量;
3、读取“huawei.png(或者du.png,或者kgy.jpg)” ,变换为灰度图,尺寸大小设置为64x64(即前一图像的尺寸/8的大小)。
保存为”mark.bmp”.
4、设置嵌入因子为0.1,对mark.bmp进行DCT变换。
5.把mark.bmp嵌入到R分量中。嵌入后的分量图像进行DCT逆变换,再合成至原图像中,并保存为withmark.bmp。显示该图像。
% The watermark image is embedded into the color image by DCT transformation
% 将水印图像做DCT变换嵌入到彩色图像中
clc;
clear all;
wtype = 'dct2';
iwtype = 'idct2';
originalImage=imread('baboon.png');
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('kgy.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('baboon.png'); % 重新读取一次原始图像,为了分离和复原颜色通道更方便。
image_g=image(:,:,2);
% 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(:,:,2)=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');
6、编写提取脚本程序,从withmark.bmp中提取嵌入的水印图像。
第二部分:CTF中隐藏题解析
登录蓝盾平台,根据个人实际完成1-3个CTF隐写练习题。