一、LSB算法
LSB全称为Least Significant Bit)翻译过来为即最低有效位。在灰度图像中,图像的灰度由八位二进制来表示即十进制中0-255,共256级别,255为白色,0为黑色。可知,二进制位越靠前则对像素点灰度的影响越大,从这点出发考虑更改像素点灰度值最低位来隐藏信息,这样对原图像的改变比较小。
LSB算法的基本过程可以描述为:若载体图像的最低比特位与嵌入信息的比特位是相同时,则不做任何改变;若载体图像的最低比特位与嵌入信息的比特位是不相同时,则分两种情况:若载体图像的最低比特位为0位即载体图像的像素值为偶数时则加一,若载体图像的最低比特位为1即载体图像的像素值为奇数时则减一。
二、matlab实现LSB算法
(1)源码
1、lsb.m
function lsb_image=lsb(lsb_image,message_image,M,N,m,n)
% lsb函数实现LSB算法即将信息图像嵌入载体图像
% lsb_image为载体图像
% message_image为信息图像
% M,N,m,n为载体和信息图像大小(其实M=m,N=n,即要求载体和信息图像大小相等才可以实现LSB算法)
if(m<=M&&n<=N)
for i=1:m % 针对每一个像素点,将载体图像的二进制最低位与信息图像进行比对,相同则不变,不同时载体图像最低位为偶数时则加1,最低位为奇数时则减一
for j=1:n
% 注意此处的message_image为二值图像只有0和1两种取值
% 此处的lsb_image为灰度图像,对于去二进制像素值最后一位的获取,采用判断像素值奇偶的方法
% 若像素值为奇数,则二进制最低位肯定为1;若像素值为偶数,则二进制最高位肯定为0(例如通过命令行窗口输入lsb_image(1,1)=78,lsb_image(1,4)=75)
if message_image(i,j)==1&&mod(lsb_image(i,j),2)==1 % 最低位都为1相同不变
continue;
elseif message_image(i,j)==1&&mod(lsb_image(i,j),2)==0 % 最低位不同,载体图像最低位为偶数时则加1
lsb_image(i,j)=lsb_image(i,j)+1;
elseif message_image(i,j)==0&&mod(lsb_image(i,j),2)==0 % 最低位都为0相同不变
continue;
elseif message_image(i,j)==0&&mod(lsb_image(i,j),2)==1 % 最低位不同,载体图像最低位为奇数时则减1
lsb_image(i,j)=lsb_image(i,j)-1;
end
end
end
else
fprintf('图像大小不匹配!');
end
end
2、outlsb.m
function hide_image=outlsb(hide_image,m,n)
% outlsb函数实现从隐藏图像中提取出信息图像
% hide_image为隐藏图像,m,n为其大小
for i=1:m
for j=1:n
% 注意提取出来的信息图像为二值图像,其中0是黑色,1为白色
if mod(hide_image(i,j),2)==1 % 对应lsb.m中的前两个判断,特别是第二个判断(当载体图像最低位为偶数时我们给其加一使其变成奇数),此时两种情况都对应这信息图像的最低位为1
hide_image(i,j)=1;
else
hide_image(i,j)=0; % 对应lsb.m中的后两个判断,特别是第四个判断(当载体图像最低位为奇数时我们给其减一使其变成偶数),此时两种情况都对应这信息图像的最低位为0
end
end
end
end
3、main.m
% 此三句清空语句需要写,若不写执行一次后,注释掉计算M,N,m,n的语句后仍能正常运行
close all;
clear all;
clc;
% 此处一定要注意im2double和double的区别,此处不能使用im2double,否则提取不出信息图像
% 应用LSB算法的图像格式需为位图形式,即图像不能经过压缩(如LSB算法多应用于png、bmp等格式,而jpg格式较少)
lsb_image=double(rgb2gray(imread('football.bmp')));
message_image=double(imbinarize(rgb2gray(imread('message.bmp'))));
[M,N]=size(lsb_image);
[m,n]=size(message_image);
hide_image=lsb(lsb_image,message_image,M,N,m,n);
figure(1),
subplot(131),imshow(lsb_image,[]);
title('载体图像');
subplot(132),imshow(message_image,[]);
title('信息图像');
subplot(133),imshow(hide_image,[]);
title('隐藏信息后的图像');
figure(2),
extract_image=outlsb(hide_image,m,n);
imshow(extract_image);
title('提取出的信息图像');
B=8; % 编码一个像素用多少二进制位
MAX=2^B-1; % 图像有多少灰度级
MES=sum(sum((lsb_image-hide_image).^2))/(M*N); % 均方差
PSNR=20*log10(MAX/sqrt(MES)); % 峰值信噪比
fprintf ('峰值信噪比是: % f\n' ,PSNR);
(2)实现效果
1、命令行窗口
峰值信噪比是: 51.138242
1、注意matlab中的im2double和double的区别
double(img)是简单的数据类型转换,将无符号整型转换为双精度浮点型double,但是数据大小没有变化。即原本数据是0到255之间,转化后还是0到255。例如原来是255则转换后为255.0,小数位0个数是由double数据长度决定,实际数据大小还是255,只不过这个255已经是double类型空间存储了,再增加不会发生溢出情况。而im2double(img)不仅仅是将uint8转换到double类型,而且把数据大小从0到255映射到0到1区间。在matlab实现LSB算法过程中,需要注意以下语句:
lsb_image=double(rgb2gray(imread('football.bmp')));
message_image=double(imbinarize(rgb2gray(imread('message.bmp'))));
参考博客:matlab中uint8,double,im2double和im2uint8的区别
2、峰值信噪比(PSNR)
PSNR是最普遍和使用最为广泛的一种图像客观评价指标,是基于对应像素点间的误差,即基于误差敏感的图像质量评价。两个 m×n 单色图像 I 和 K,其均方误差MSE定义为:
峰值信噪比PSNR定义为:
其中MAX是表示图像点颜色的最大数值,一般的灰度图像一个像素使用八位二进制数字表示,即像素灰阶数为MAX=2^8-1=255,且单位dB。
3、LSB算法的图片格式
应用LSB算法的图像格式需为位图形式,即图像不能经过压缩,即LSB算法多应用于png、bmp等格式,而jpg格式较少。png、bmp和jpg图片格式对比如下:
从百度下载一张图片都是webp格式,将其后缀名分别改成bmp、png和jpg,发现其大小没有任何变化,所以采用此方法没有任何作用,我不知道为什么,后面若是想通再回来补充(此处测试的图片是直接修改后缀名后的图片)。
JPG:使用的一种失真压缩标准方法,24 bit真彩色,不支持动画、不支持透明色。JPEG的压缩方式通常是破坏性资料压缩(lossy compression),即在压缩过程中图像的品质会遭受到可见的破坏。一张图片多次上传下载后,图片逐渐会失真。
PNG:格式是无损数据压缩的,PNG格式有8位、24位、32位三种形式,其中8位PNG支持两种不同的透明形式(索引透明和alpha透明),24位PNG不支持透明,32位PNG在24位基础上增加了8位透明通道(32-24=8),因此可展现256级透明程度。
BMP:是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP图像所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
参考博客:LSB 图像隐写与提取算法
4、关于理解LSB算法的小例子
解释:120,121是从载体图像中取出两个像素值,变为二进制数分别为:01111000,01111001,秘密信息分别为1,1。因为120的二进制数01111000最低位为0与秘密信息1不同,进行替换为01111001;121的二进制数01111001最低位为1与秘密信息1相同,保持不变.