图像隐写算法LSB—Least Significant Bits,又称最不显著位。LSB算法就是将秘密信息嵌入到载体图像像素值得最低有效位,改变这一位置对载体图像的品质影响最小。
原理 :
以实验用的24位真彩图为例,每个像素用3Byte表示,每Byte分别表示R、G、B三色的亮度,亮度取值范围位0~0xFF。采用LSB算法就是将图像信息的每一Byte的最后一位二进制替换为待嵌入的秘密信息的一位,按顺序进行。因为对最后一位的替换操作其实就是对亮度信息的加一或减一,对颜色影响甚微,所以肉眼难以察觉,这就达到了隐藏信息的目的。对于24位真彩图,所能嵌入的最大秘密信息的大小为像素数量的3/8字节
/*** change.c ***/ #include<stdio.h> #include<stdlib.h> #include"define.h" int main() { //创建头文件,信息头结构变量 BMP_FILE_HEADER fileHeader; BMP_INFO_HEADER infoHeader; //打开载体图像文件,新建修改后的图像文件 FILE *file = fopen("football.bmp","rb"); FILE *newFile = fopen("change.bmp","wbx"); //读取文件头,信息头 fread(&fileHeader,14,1,file); fread(&infoHeader,40,1,file); //读取24位真彩图像的像素信息 RGB *img = (RGB *)malloc(infoHeader.sizeImage); fread(img,infoHeader.sizeImage,1,file); printf("Picture Size(width x height):%d x %d ", infoHeader.width, infoHeader.height); //对图片内容进行修改,每隔五个像素染黑一个像素 int i = 0; for (i = 0; i < infoHeader.sizeImage / 3; i += 5) { img[i].red = 0; img[i].green = 0; img[i].blue = 0; } printf("fwirte"); //将新的二进制文件写入到新文件中 fwrite(&fileHeader,14,1,newFile); fwrite(&infoHeader,40,1,newFile); fwrite(img,infoHeader.sizeImage,1,newFile); fclose(file); fclose(newFile); return 0; }
infoHeader.sizeImage表示图像数据的字节数,在24位真彩位图中,表示每个像素需要三个字节,infoHeader.sizeImage/3表示位图总像素数
循环体中将每个颜色分量的亮度赋值为0,让像素变黑,最终得到修改后的图像。
以上是处理BMP图像信息的原理。
下面通过LSB算法隐藏秘密信息,这里把define.h文件作为秘密信息隐藏,也可以选择任何大小合适的文件作为秘密信息。
LSB全称为 least significant bit,是最低有效位的意思。Lsb图片隐写是基于Lsb算法的一种图片隐写术,一般能使用LSB进行隐写的图片需要是无损压缩(png图片)或者无压缩的图片(BMP图片),因为这能保证我们修改的信息不至于丢失,也就能得到正确的表达。
以png图片为例子,png图片中的图像像数一般是由RGB三原色(红绿蓝)组成,每一种颜色占用8位,取值范围为0x00~0xFF,即有256种颜色,一共包含了256的3次方的颜色,即16777216种颜色。而人类的眼睛可以区分约1000万种不同的颜色,这就意味着人类的眼睛无法区分余下的颜色大约有6777216种。
而LSB隐写算法就是去修改RGB颜色分量的最低二进制位也就是最低有效位(LSB),人类的眼睛不会注意到这前后的变化,每个像素可以携带3比特的信息。
例如下面这张经典的图:绿色,十进制的235,二进制的11101011,通过二进制运算加、减3修改最低有效位,发现肉眼根本区分不出来差别:
文章来源: xiaoshen
- 还没有人评论,欢迎说说您的想法!