图像处理之LSB替换隐写算法的实现

一、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为二值图像只有01两种取值
            % 此处的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

2、效果图像
在这里插入图片描述
在这里插入图片描述
三、相关知识和思考

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相同,保持不变.

猜你喜欢

转载自blog.csdn.net/qq_44111805/article/details/126662757