📜  使用MATLAB的基于LSB的图像隐写术

📅  最后修改于: 2021-04-17 02:19:22             🧑  作者: Mango

先决条件:图像隐写术简介,使用Python实现。

隐写术是将秘密数据隐藏在任何形式的数字媒体中的方法。隐秘术的主要思想是将数据的存在隐藏在音频,视频,图像等任何介质中。当我们谈论图像隐秘术时,这个思想很简单。图像由像素组成,通常指的是该特定像素的颜色。在灰度(黑白)图像中,这些像素值的范围为0-255,0为黑色,255为白色。

基于LSB的数据嵌入的概念:

LSB代表最低有效位。 LSB嵌入背后的想法是,如果我们更改像素的最后一位,则颜色不会有太多可见变化。例如,0为黑色。将该值更改为1不会有太大区别,因为它仍然是黑色,只是较浅的阴影。

编码使用以下步骤完成:

  1. 将图像转换为灰度
  2. 根据需要调整图像大小
  3. 将消息转换为其二进制格式
  4. 初始化与输入图像相同的输出图像
  5. 遍历图像的每个像素并执行以下操作:
    • 将像素值转换为二进制
    • 获取要嵌入的消息的下一部分
    • 创建一个可变的温度
    • 如果消息位和像素的LSB相同,则将temp设置为0
    • 如果消息位和像素的LSB不同,则将temp设置为1
    • 可以通过对消息位与像素的LSB进行XOR来完成此温度设置
    • 将输出图像的像素更新为输入图像的像素值+温度
  6. 不断更新输出图像,直到嵌入消息中的所有位
  7. 最后,将输入以及输出图像写入本地系统。

例子:

输入: message =’geeksforgeeks’

输出:嵌入了给定消息的图像:

下面是在MATLAB中的实现:

% Clear the existing workspace
clear all;
  
% Clear the command window
clc;
  
% Read the input image
input = imread('peppers.png');
  
% Convert image to greyscale
input=rgb2gray(input);
  
% Resize the image to required size
input=imresize(input, [512 512]);
  
% Message to be embedded
message='geeksforgeeks';
  
% Length of the message where each character is 8 bits
len = length(message) * 8;
  
% Get all the ASCII values of the characters of the message
ascii_value = uint8(message);
  
% Convert the decimal values to binary
bin_message = transpose(dec2bin(ascii_value, 8));
  
% Get all the binary digits in separate row
bin_message = bin_message(:);
  
% Length of the binary message
N = length(bin_message);
  
% Converting the char array to numeric array
bin_num_message=str2num(bin_message);
  
% Initialize output as input
output = input;
  
% Get height and width for traversing through the image
height = size(input, 1);
width = size(input, 2);
  
% Counter for number of embedded bits
embed_counter = 1;
  
% Traverse through the image
for i = 1 : height
    for j = 1 : width
          
        % If more bits are remaining to embed
        if(embed_counter <= len)
              
            % Finding the Least Significant Bit of the current pixel
            LSB = mod(double(input(i, j)), 2);
              
            % Find whether the bit is same or needs to change
            temp = double(xor(LSB, bin_num_message(embed_counter)));
              
            % Updating the output to input + temp
            output(i, j) = input(i, j)+temp;
              
            % Increment the embed counter
            embed_counter = embed_counter+1;
        end
          
    end
end
  
% Write both the input and output images to local storage
% Mention the path to a folder here.
imwrite(input, 'path_to_folder\originalImage.png');
imwrite(output, 'path_to_folder\stegoImage.png');

图片比较:

正如我们在上面的屏幕截图中看到的那样,人眼看起来输入和输出图像完全相同。输出图像中嵌入了消息。

这种方法的优点:

  • 与其他图像隐写方法相比,该方法非常快速且易于实现。
  • 输出图像与输入图像有很小的差异。
  • 我们可以将消息嵌入最后两个LSB中,而不是仅将消息嵌入到LSB中,从而甚至可以嵌入较大的消息。
  • 此方法构成了许多其他复杂算法的基础
  • 我们可以将消息嵌入最后两个LSB中,而不是仅将消息嵌入到LSB中,从而甚至可以嵌入较大的消息。

此方法的缺点:

  • 这种数据编码方式很弱,因为可以很容易地通过获取图像的LSB并以二进制格式获取消息来对其进行解码。
  • 此方法过旧,因为很久以前还没有开发其他编码方法时就使用了该方法。
  • 当将消息嵌入一个以上的LSB中时,图像质量可能会下降,具体取决于更改了多少个像素。