MATLAB - Matlab 的优势和特点:
(1)友好的工作平台和编程环境
MATLAB 由一系列工具组成。这些工具方便用户使用
MATLAB 的函数和文件,其中许工具采用的是图形用
户界面。包括 MATLAB 桌面和命令窗口、历史命令窗
口、编辑器和调试器、路径搜索和用于用户浏览帮
助、工作空间、文件的浏览器。随着 MATLAB 的商业
化以及软件本身的不断升级,MATLAB 的用户界面也
越来越精致,更加接近 Windows 的标准界面,人机
交互性更强,操作更简单。而且新版本的 MATLAB 提
供了完整的联机查询、帮助系统,极大的方便了用
户的使用。简单的编程环境提供了比较完备的调试
系统,程序不必经过编译就可以直接运行,而且能
够及时地报告出现的错误及进行出错原因分析。
(2)简单易用的程序语言
Matlab 一个高级的距阵/阵列语言,它包含控制语
句、函数、数据结构、输入和输出和面向对象编程
特点。用户可以在命令窗口中将输入语句与执行命
令同步,也可以先编写好一个较大的复杂的应用程
序(M 文件)后再一起运行。新版本的 MATLAB 语言是
基于最为流行的 C++语言基础上的,因此语法特征
与 C+语言极为相似,而且更加简单,更加符合科技
人员对数字表达式的书写格式。使之更利于非计算
机专业的科技人员使用。而且这种语言可移植性好、
可拓展性极强,这也是 MATLAB 之所以能够深入到科
学研究及工程计算各个领域的重要原因。
LSB 算法水印安全性测试
LSB 算法水印源码
1、嵌入源码
clear all;
% 保存开始时间
start_time=cputime;
% 读入原图像
file_name='lena.bmp';
[cover_object,map]=imread(file_name);
% 读入水印图像
file_name='2.bmp';
[message,map1]=imread(file_name);
message1=message;
message=double(message); %%转换为 double 数
message=fix(message./2); %%转换为 0,1 组成的矩阵
message=uint8(message); %%转换为 uint8 数
% 原图的行数与列数
Mc=size(cover_object,1); %原图的行数
Nc=size(cover_object,2); %原图的列数
% 水印的行数与列数
Mm=size(message,1);
Nm=size(message,2);
% 将水印扩展为原图像大小,并写入 watermark
for ii = 1:Mc
for jj = 1:Nc
%水印的行数
%水印的列数
watermark(ii,jj)=message(mod(ii,Mm)+1,mod(jj,Nm)+1);
end
end
% 将原图的最低有效位值换为水印的值
watermarked_image=cover_object;
for ii = 1:Mc
for jj = 1:Nc
watermarked_image(ii,jj)=bitset(watermarked_image(ii,jj),1,watermark(ii,jj));
end
end
% 将嵌入水印图像写入 lsb_watermarked.bmp
imwrite(watermarked_image,'lsb_watermarked.bmp','bmp');
% 显示运行时间
elapsed_time=cputime-start_time,
% 显示嵌入水印图像
figure(1)
subplot(1,2,1)
imshow(watermarked_image,[])
title('嵌入水印图像')
subplot(1,2,2)
imshow(cover_object,[])
title('原图像')
%%扩展后水印
for ii = 1:Mc
for jj = 1:Nc
watermark1(ii,jj)=message1(mod(ii,Mm)+1,mod(jj,Nm)+1);
end
end
figure(2)
imshow(watermark1,[])
title('扩展后的水印')
figure(3)
imshow(message1,[])
title('原水印')
2、提取源码
clear all;
% 保存开始时间
start_time=cputime;
% 读入嵌入水印图像
file_name='440.bmp';
watermarked_image=imread(file_name);
% 嵌入水印图像的行数与列数
Mw=size(watermarked_image,1); %嵌入水印图像行数
Nw=size(watermarked_image,2); %嵌入水印图像列数
%读入原始水印
file_name='2.bmp';
orig_watermark=imread(file_name);
%%原始水印的行数与列数
Mm=size(orig_watermark,1);
Nm=size(orig_watermark,2);
% 用嵌入水印图像的最低有效位重建水印
for ii = 1:Mw
for jj = 1:Nw
%水印的行数
%水印的列数
watermark(ii,jj)=bitget(watermarked_image(ii,jj),1);
end
end
% 将提取水印变为原始水印大小
watermark=2*double(watermark);
for ii = 1:Mm-1
for jj = 1:Nm-1
watermark1(ii+1,jj+1)=watermark(ii,jj);
end
end
watermark1(1,1)=watermark(Mm,Nm);
% 显示运行时间
elapsed_time=cputime-start_time,
% 显示提取水印与原始水印
figure(4)
subplot(1,2,1)
imshow(watermark1,[])
title('提取水印')
subplot(1,2,2)
imshow(orig_watermark,[])
title('原始水印')
3、中值滤波处理
二维中值滤波器对图像的处理是用一个二维的窗口去依次成块地覆盖图像中的像素,用
覆盖的那些像素值的中值去取代窗口正中的那个像素的值。假设图像的大小为 K×L,在用滤
波器处理图像之前还要进行点扩展,以保证输出的图像大小与原来的一致,扩展点的个数取
决于图像的大小和窗口的大小,下面是一个图像大小为 3×3,窗口大小也为 3×3 的点扩展的
图示,如图 7-12 所示。
下图是 lenna 的原始图像和做 7×7 的中值滤波后的结果 :
图 7-12 二维中值滤波像素点扩展图示
程序源码如下:
%文件名:median16.m
图 7-13 中值滤波结果
%目的:完成对图像的中值滤波
%引用举例: image_opd=median16('lsb_watermarked.bmp',3);
%参数说明:
%image 待做中值滤波的图像
%x
二维中值滤波器的窗口尺寸参数,窗口大小为 x*x,这里的二维中值滤波器
为常规中值滤波器
function image_opd=median16(image,a);
A=imread(image);
[row,col]=size(A);
A=double(A)/65535;
original=A;
B=reshape(A,row,col);
C= medfilt2(B,[a a]);
col=col/3;
image_opd=reshape(C,row,col,3);
imwrite(uint8(image_opd*65535),'temp2.png','BitDepth',16);
%以 png 格式存储
运行 LSB 提取水印图片
中值滤波处理后,水印仍清晰可见。
分别选取五组图片,进行实验,将实现结果图片粘贴,分别命名为 3-1、3-2、3-3、3-
4、3-5。
4、加盐噪声后提取水印(椒盐噪声是图像中经常见到的一种杂讯,它是一种随机的白点或
者黑点,可通过中值滤波去除噪声)
椒盐噪声代码如下:
M=imread('lsb_watermarked.bmp');
P2=imnoise(M,'salt & pepper',0.002)
subplot(3,3,3)
imshow(P2)
title('salt & pepper noise');
让可看到水印内容。
分别选取五组图片,进行实验,将实现结果图片粘贴,分别命名为 3-1、3-2、3-3、3-
4、3-5。
5、JPEG 压缩水印图像
压缩后,水印无法提取。
分别选取 1 组图片,进行实验,将结果实现图片粘贴。