前言
已经好久没写博客了,最近是在有些忙,但是忙里偷闲写一篇新学的知识点,所以准备写这篇博客与大家分享。这篇博文是关于信息安全中的一个简单算法:LSB(最低有效位)算法实现图片数字水印隐写功能,就是如何将我们的水印图片嵌入到主体图像中,其中源码已经上传至GitHub,各位读者可以下载使用。其中不仅包括算法源码还有可视化图形界面的代码,方便读者调试使用。废话不多说,下面开始本篇博文的具体内容。
一、图像处理基础
- 图像的分类
我们日常生活中的图像大致分为三类:黑白图像、灰度图像、彩色图像
- 二进制图像
二进制图像顾名思义就是图像像素只存在0,1两个值。一个二进制图像显然是纯黑白的。每一个像素值将取两个离散值(0或1)中的一个,0表示黑,1表示白。
- 灰度图像
灰度图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度。一般使用使用无符号8位整型表示
- 灰度图像的二维矩阵表示
①:本张图片为一张灰度图片,我们要将其转换为二进制代码表示的矩阵形式,可以使用MatLab或者Python进行处理,在这里我使用MatLab读取图片:A=imread(`background.bmp`);
②:下图为读取后的灰度图像对应的二维矩阵,可以看到都是由0-255的数字组成,只有一个通道
- 灰度图像的二值化方法
所谓灰度图像的二值化方法实际上解决的就是将灰度图像转换为二值图像(黑白图像)这一问题。转换的方法可用伪C语言描述为:
设 G(x,y) 为图像的灰度G的像素
float threshold; //定义一个转换阈值
if (G(x,y) >=threshold)
B(x,y)=1;
else
B(x,y)=0;
则下图为G的二值转换图。
- RGB图像
RGB图像仅是一类图像的总称,每一个像素的颜色由存储在相应位置的红、 绿、蓝颜色分量共同决定。RGB图像是 24位图像,红、绿、蓝分量分别占用8位,理论上可以包含16M种不同颜色,由于这种颜色精度能够再现图像的真实色彩, 所以又称RGB图像为真彩图像。
- RGB的表示
我们可以用一个由R、G、B为坐标轴定义的单位立方体来描述一个符合视觉理论的颜色模型。 原点代表黑色,(1,1,1)代表白色,将坐标轴上的顶点称为基色。立方体中的每一个颜色由一个三元组(R,G,B)表示,每一个分量的数值一般在[0,255]区间,每个位置代表不同的颜色,如下两图表示。
二、LSB数字隐写算法
- LSB简介
空域图像水印技术是指在图像的空间域中嵌入水印的技术。 最简单和有代表性的方案就是用秘密信息代替图像的最低有效位(LSB)或者多个位平面的所有比特的算法。 LSB(Least Significant Bits)算法:将秘密信息嵌入到载体图像像素值的最低有效位。如下图,我们可以将其每八位的最后一位替换成我们的秘密信息,也就完成了信息隐写的过程。
- LSB原理
①:LSB隐写原理源于图片中的像素一般是由三种颜色组成,即三原色(红绿蓝),由这三种原色可以组成其他各种颜色,在PNG图片的存储中,每个颜色占有8bit,即有256种颜色,一共包含256的三次方颜色,即16777216中颜色,人类的眼睛可以区分约1000万种不同的颜色,剩下无法区分的颜色就有6777216,当我们把其中一些信息改变,图片只发生位变化(取最低位,权值最小),而人是觉察不到这种变化的,当时里面的信息却发生了变化,这样就实现了我们的数字隐写功能。PNG图片格式和BMP图片格式都是一种无损压缩,LSB隐写就是修改了像素中的最低位缩的图片上实现LSB隐写,如果是JPG图片,就没办法使用LSB隐写了,因为其是有损压缩。
②:例如,10进制的235表示的是绿色,我们修改二进制中的最低位,颜色依旧看不出有什么变化,还能保存我们的秘密水印,从而达到隐藏信息的目的
- LSB流程
- LSB特点
- 方法有一般性,可用于变化域
- 非常简单
- 非常快
- 易于实现
- 很高的容量和嵌入效率
- LSB位是随机的,与高位和其他点无关
- 优化比较方便
三、LSB数字隐写算法实现
- 初始化载体图像
- 初始化水印图像
- 嵌入水印
- 提取已嵌入水印
四、数字隐写和提取过程
- 运行image_processing_interface.m进入主界面
- 载入宿主图片
- 载入水印图片
- 嵌入水印后的宿主图片
- 提取到的水印图片
- 二值化后的水印图片
总结
到此为止这篇博文也告一段落了,这个算法作为信息安全技术的入门算法,还是比较简单易学的,以后我可能会写更多的关于信息安全方面的博客,因为也准备好好学学这个方向,所以请各位读者敬请期待!