• 图像处理之LSB Matching Revisited论文复现


    一、LSB Matching Revisited摘要

    在这里插入图片描述
    这篇本章提出了对最低有效位(LSB)匹配的修改,这是一种将信息位嵌入静止图像的隐写法。在LSB匹配中,从载体图像的像素中增加或减少一个的选择是随机的。新方法使用选择将两个载体像素的二进制函数设置为所需的值。使用一对像素作为单位来执行嵌入,其中第一个像素的LSB携带一个比特的信息,两个像素值的函数携带另一个比特的信息。因此,改进后的方法允许嵌入与LSB匹配相同的有效载荷,但对载体图像的变化较少。实验结果表明,该方法在失真和抗隐写分析方面优于传统的LSB匹配。

    二、提出的方法

    提出的方法使用灰度载体图像。信息嵌入一次针对两个载体图像的像素进行。这两个像素的灰度值是xi和xi+1。信息嵌入后,第i个信息位mi的值等于隐写图像的第i个像素yi的LSB。第i+1个信息位mi+1的值是yi和yi+1的函数,其中函数为 f(yi,yi+1)=LSB(⌊yi/2⌋+yi+1)。一对像素的嵌入算法如下图所示:
    在这里插入图片描述
    注意文中提出的一个细节:

    A step in the algorithm yi+1=xi+1 ±1 either adds or subtracts one from the cover image pixel xi+1. The choice of whether to add or subtract one is performed separately, both for the even- and odd-valued regions. The even- and odd-valued regions refer to the areas of the cover image where the pixel values are even and odd, respectively.
    即:算法中的一个步骤是yi+1=xi+1 ±1,从载体图像像素xi+1中增加或减去一个。对偶数和奇数区域来说,是加一还是减一的选择是单独进行的。偶数和奇数区域指的是载体图像中像素值分别为偶数和奇数的区域。暗示我们在复现论文时,需要对奇偶区域分情况讨论

    2008年一篇名为An Information Hiding Scheme Using Sudoku的文章对LSB Matching Revisited提出的算法总结得更加到位:
    在这里插入图片描述
    在这里插入图片描述

    三、实例验证

    (1)M1:
    在这里插入图片描述

    解释:信息位和载体图像像素值的LSB都是0,保持不变。

    (2)M2:

    在这里插入图片描述
    解释:信息位分别为0和1,第一个信息位与第一个载体图像像素值LSB相等,进入算法的第二if,有f(120,130)不等于第二个信息位,执行加减一操作即有两个值,此处需要判断第二信息位奇偶,算法中并没有明确分情况讨论仅以yi+1=xi+1 ±1表示。

    (3)M3:
    在这里插入图片描述
    解释:信息位分别为1和0,第一个信息位与第一个载体图像像素值LSB不相等,进入else,又第二信息位与f(119,130)不相等(简单计算一下:119/2向下取整为59,又59+130=189,其二进制数为10111101,即LSB为1,0和1不相等),即进入else中的else操作,即yi=120+1=121,直接令yi+1=xi+1。

    (4)M4:

    在这里插入图片描述

    解释:信息位分别为1和0,第一个信息位与载体图像第一个像素值LSB不相等,进入else,根据算法又第二个信息位与f(119,130)相等(简单计算一下:119/2向下取整为59,又59+130=189,其二进制数为10111101,即LSB为1),则yi=120-1=119,直接令yi+1=xi+1。

    四、matlab代码复现

    1、lsbmatching.m

    function cover_image=lsbmatching(cover_image,message_image,M,N,m,n)
    % lsbmatching函数实现将信息图像嵌入载体图像
    % lsb_image为载体图像
    % message_image为信息图像
    % M,N,m,n为载体和信息图像大小(其实M=m,N=n,即要求载体和信息图像大小相等才可以实现改进的LSB匹配算法)
    
    for i=1:m
        for j=1:2:n    % 注意改进的LSB算法中,要求对一对像素值同时进行操作,故对于列要以间隔为2进行遍历,且注意数组越界问题(当列等于图像的宽或宽减一时说明已经遍历到头则需进行下一行的遍历)
            if (j==n||j==n-1)&&(i<m)
                i=i+1;
            end
            if message_image(i,j)==mod(cover_image(i,j),2) % 信息图像第一个像素值与载体图像的LSB相同的前提下进入判断
                if message_image(i,j+1)~=mod((floor(cover_image(i,j)/2)+cover_image(i,j+1)),2) %  信息图像第二个像素值与公式计算出的载体图像的LSB不相同时,对载体图像的像素值执行加一或减一操作
                    if mod(cover_image(i,j+1),2)==1              % 当载体图像的像素值为奇数时执行减一操作
                        cover_image(i,j+1)=cover_image(i,j+1)-1;
                    end
                    if mod(cover_image(i,j+1),2)==0              % 当载体图像的像素值为偶数时执行加一操作
                        cover_image(i,j+1)=cover_image(i,j+1)+1;
                    end
                else   % 信息图像第二个像素值与公式计算出的载体图像的LSB相同时,载体图像的第二个像素值保持不变
                    cover_image(i,j+1)=cover_image(i,j+1);
                end    % 上面已经判断过信息图像第一个像素值与载体图像的LSB相同,载载体图像的第一个像素值保持不变
                cover_image(i,j)=cover_image(i,j);
            elseif message_image(i,j)~=mod(cover_image(i,j),2)
                if message_image(i,j+1)==mod((floor(cover_image(i,j)/2-1)+cover_image(i,j+1)),2)
                    cover_image(i,j)=cover_image(i,j)-1;
                else
                    cover_image(i,j)=cover_image(i,j)+1;
                end    % 上面已经判断过信息图像第二个像素值与载体图像的LSB相同,载载体图像的第二个像素值保持不变
                cover_image(i,j+1)=cover_image(i,j+1);
            end
        end
    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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    2、main.m

    % 此三句清空语句需要写,若不写执行一次后,注释掉计算M,N,m,n的语句后仍能正常运行
    close all;
    clear all;
    clc;
    % 此处一定要注意im2double和double的区别,此处不能使用im2double,否则提取不出信息图像
    % 应用LSB算法的图像格式需为位图形式,即图像不能经过压缩(如LSB算法多应用于png、bmp等格式,而jpg格式较少)
    cover_image=double(rgb2gray(imread('football.bmp')));
    message_image=double(imbinarize(rgb2gray(imread('message.bmp'))));
    [M,N]=size(cover_image);
    [m,n]=size(message_image);
    hide_image=lsbmatching(cover_image,message_image,M,N,m,n);
    
    figure(1),
    subplot(131),imshow(cover_image,[]);
    title('载体图像');
    subplot(132),imshow(message_image,[]);
    title('信息图像');
    subplot(133),imshow(hide_image,[]);
    title('隐藏信息后的图像');
    
    B=8;         % 编码一个像素用多少二进制位
    MAX=2^B-1;   % 图像有多少灰度级        
    MES=sum(sum((cover_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

    3、实现效果
    在这里插入图片描述
    命令行的输出结果:

    峰值信噪比是:  53.171460
    
    • 1

    五、文章不足

    1、对于像素值255和0无法进行加一和减一的操作,造成越界。
    2、本算法只适用于灰度图像,无法在彩色图像上进行操作。
    3、没有研究如何改变秘密信息嵌入的顺序来抵御传播过程中的失真。
    4、文章只给出了秘密信息的嵌入算法,并没有给出秘密信息的提取算法,正常的思路只能是通过嵌入的逆向操作来获取秘密信息,但是过程中可能存在安全性问题。

    由于刚刚开始学习图像处理,对于很多知识理解不到位。如有错误,恳请指正,任重而道远,慢慢加油!

    PS:对秘密信息的提取算法尚未成功复现,后面若复现成功,再回来补充!

    论文网址:
    (1)LSB matching revisited
    (2)An Information Hiding Scheme Using Sudoku

  • 相关阅读:
    VSCODE的常用插件
    Spring Boot和Spring MVC常用注解
    刷题记录(NC235611 牛牛国的战争,NC23803 DongDong认亲戚,NC235622 叠积木)
    打造完美照片,尽在PhotoFoundry for Mac
    一站式统一返回值封装、异常处理、异常错误码解决方案—最强的Sping Boot接口优雅响应处理器
    dantax参数调优
    568A和568B两种线序
    韩信点兵:求韩信一共有多少兵
    【springboot】 整合 jasypt 配置信息加密
    Linux权限
  • 原文地址:https://blog.csdn.net/qq_44111805/article/details/126724487