• 图像处理之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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    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         
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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); 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    (2)实现效果

    1、命令行窗口

    峰值信噪比是:  51.138242
    
    • 1

    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'))));
    
    • 1
    • 2

    参考博客: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相同,保持不变.

  • 相关阅读:
    《工厂模式(极简c++)》
    【Redis场景5】集群秒杀优化-分布式锁
    Python 通过adb传输文件到手机
    k8s的ClusterIP和NodePort类型有何不同
    C++数据结构X篇_17_C++实现二叉树的非递归遍历(企业链表实现栈,利用栈的先进后出特点实现二叉树的非递归遍历)
    java变量-未分类
    降级、熔断和限流———一看就会
    Redis中的数据类型及与Mysql数据库同步方法
    【Redis】基于Redis6的数据类型以及相关命令、应用场景整理
    一文了解Spring MVC(上)
  • 原文地址:https://blog.csdn.net/qq_44111805/article/details/126662757