BMP图像位图法隐藏信息

BMP图像

● BMP是bitmap的缩写形式,bitmap顾名 思义,就是位图也即Windows位图。它般由4部分组成: 文件头信 息块、图像描述信息块、颜色表(在真彩色模式无颜色表)和图像数据区组成。在系统中以BMP为扩展名保存。

● BMP图像文件格式是微软公司为Windows环境设置的标准图像格式,并且内含了一套图像处理的API函数。随着WINDOWS在世界范围内的普及,BMP文件格式越来越多
地被各种应用软件所支持。打开Windows的 画图程序,在
保存图像时,可以看到以下选项: 2色位图(黑白)、16色位图、256色位图和24位位图,这是最普通的生成位图的方法。

● BMP文件由以下4部分组成,其中前2部分合称为BMP文件头,储存了BMP图像一些基本信息;后2部分则用于放置图像的数据信息。作为BMP图像中的一一种,24位BMP图像文件的结构特点为:

1,每个文件只能非压缩地存放一~幅彩色图 像
2,文件头通常由54个字节的数据段组成,包含下面介绍的图像文件头和图像信息头两部分,其中有该图像文件的类型、大小、图像尺寸及打印格式等信息;
3,从第55个字节开始,是该文件的图像数据部分,数据的排列顺序以图像的左下角为起点,每连续3个字节便描述图像一个像素点的颜色信息,这三个字节分别代表蓝、绿、红三基色在此像素中的亮度,若某连续三个字节为: 00H,00H,FFH, 则表示该像素的颜色为纯红色。

信息隐藏

● 信息隐藏是将需保密的信息隐藏到另外一个可以公开的媒体之中,具体来说,就是把指定的信息隐藏于数字化的图像、声音或文本中,充分利用人们的“所见即所得”的心
理,来迷惑恶意的攻击者。通常,我们称这个媒体为掩护
媒体(cover-media) ,隐藏的动作称为嵌入(embedding),掩护媒体经嵌入信息后变成一个伪装媒体(stego-media)。
● 近年来,随着计算机和Internet的迅速发展,信息隐藏问题越来越引起人们的关注。信息隐藏与信息加密是不尽相同的,信息加密是隐藏信息的内容,而信息隐藏是隐藏信息的存在性,信息隐藏比信息加密更为安全,因为它不容易引起攻击者的注意。
● 图像信息隐藏是近年信息隐藏技术中新起的研究课题,它以数字图像为掩护媒体,将需要保密的信息按照某种算法嵌入数字图像中,并且要求:
(1)嵌入信息后的图像与原始图像相比,在人的视觉上没有什么区别;
(2)数据隐藏要不改变掩护媒体的数据量,即直接对媒体数据的某些部分进行修改,而不增加掩护媒体的数据。

信息的嵌入

● 信息嵌入是把待隐藏信息加入到掩护媒体中。
● 一幅24位BMP图像,由54字节的文件头和图像数据部分组成,其中文件头不能隐藏信息,从第55字节以后为图像数据部分,可以隐藏信息。图像数据部分是由一- 系列的8位二进制数所组成,由于每个8位二进制数中“1”的个数或者为奇数或者为偶数,约定:若一个字节中“1”的个数为奇数,则称该字节为奇性字节,用“1”表示;若一个字节中“1”的个数为偶数,则称该字节为偶性字节,用“0”表示。我们用每个字节的奇偶性来表示隐藏的信息。
举例:

设一-段24位BMP文件的数据为: 01 100110,00111100,
10001111, 00011010, 00000000, 10101011,00111110,101 10000,则其字节的奇偶排序为: 0,0, 1,1, 0, 1,1,1。现在需要隐藏16进制信息4F,由于4F转化为8位二进制为01001111,将这两个数列相比较,发现第2,3, 4,5位不一-致,于是对这段24位BMP文件数据的某些字节的奇偶性进行调制,使其与4F转化的8位二进制相一-致:

第2位:将00111100变为00111101, 则该字节由偶变为奇;
第3位:将10001111变为10001110,则该字节由奇变为偶;

第4位:将0001 1010变为00011011,则该字节由奇变为偶;
第5位:将00000000变 为00000001,则该字节由偶变为奇。

经过这样的调制,此24位BMP文件数据段字节的奇偶性便
与4F转化的8位二进制数完全相同,这样,8个字节便隐藏
了一个字节的信息。

信息嵌入总结

将信息嵌入BMP文件的步骤为:
(1)将待隐藏信息转化为二进制数据码流;
(2)将BMP文件图像数据部分的每个字节的奇偶性与,上述二进制数码流进行比较;
(3)通过调整字节最低位的“0”或“1”,改变字节的奇偶性,使之与上述二进制数据流一致,即将信息嵌入到24位BMP图像中。

信息提取

(1)判断BMP文件图像数据部分每个字节的奇偶性,若字节中“1”的个数为偶数,则输出“0”;若字节中“1”的个数为奇数,则输出“1”;

(2)每判断8位输出数,便将其组成一个二进制数(先输出的为高位) ;

(3)经过上述处理,得到一系列8位二进制数, 便是隐藏信息的代码,将代码转换成文本、图像或声音,就是隐藏的信息。

结论

(1)由于原始24位BMP图像文件隐藏信息后,其字节数
值最多变化1 (因为是在字节的最低位加“1”或减“1”),该字节代表的颜色浓度最多只变化了1/256,所以,已隐藏信息的BMP图像与未隐藏信息的BMP图像,用肉眼是看不出差别的;

(2)将信息直接嵌入像素RGB值的优点是嵌入信息的容量与所选取的掩护图像的大小成正比,而不再仅仅局限于调色板的大小;

(3)使用这种方法,一.个大小为32k的24位BMP图像文件,可以隐藏约32k/8= =4k的信息(忽略文件头不能隐藏数据的54个字节),该方法具有较高的信息隐藏率;

(4)由于信息都被隐藏在最低位,所以攻击者可以轻易地将隐藏的信息去除掉。所以这种方法只有在第三方未知的情况下隐藏信息才有效,也就只能作为一种信息隐藏的方法。因为不具有鲁棒性也就不能称为水印。

位图法说明

虽然位图法现在已经不太被使用了,但作为一-种非常基础的信息隐藏的方法,具有的操作简单,信息量大的特点,仍然有很高的实验价值。由于传输限制,我们必须将所要传输的明文转变为二进制代码。对于汉字,按照汉字unicode编码表转化为十六进制编码,然后再转为二进制代码;对于英文字母和符号,按照ASCII码对照表转化为十六进制编码,然后再转化为二进制代码。这样才能将数据嵌入图像中传输出去。

在具体实验中还需要在所传输的实验数据之前添加两个标识符:
第一个用来标识所传输文字的类型,称为“文字标识符”,占用1个字节,如果是英文,则置为00;如果是中文,则置为01。

第二个用来标识传输的明文数据长度,称为“数据标识符”,在做实验时这个标识符选择1个字节来进行存储,也就是说我们要传输的明文最多可以有99个(采用10进制)汉字或英文字母、符号。在提取信息时,如果传输的是汉字,数据标识符X4X4为后面传输的二进制代码位数,如果传输的是英文和符号,则数据标识符的值X2X4为后面传输的二进制代码位数。


举个例子,如果我们要传输中文“你好”,查得对应的Unicode码是: 4F60 597D。因为是中文,所以文字标识符取为: 01;因为只有两个汉字,所以数据标识符取为: 02(即后面传输的二进制数据代码有2X4X4=32位)。所以我们要传输的数据应该是: 01024F60597D, 变为二进制就是
00000001000000100100111101 1000000101100101111101,按照位图法的方法嵌入图像中即可。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用直方图实现图像检索的Python代码示例: ```python import cv2 import numpy as np import os # 计算图像的直方图 def calcHist(img): # 将图像转换为HSV颜色空间 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 设置直方图的参数 histSize = [180, 256] # H通道取值范围为0~180,S通道取值范围为0~256 hRanges = [0, 180] sRanges = [0, 256] ranges = hRanges + sRanges channels = [0, 1] # 只考虑H和S两个通道 # 计算直方图 hist = cv2.calcHist([hsv], channels, None, histSize, ranges) # 归一化直方图 cv2.normalize(hist, hist, 0, 1, cv2.NORM_MINMAX) return hist.flatten() # 计算两个直方图之间的相似度 def calcSimilarity(hist1, hist2): return cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL) # 加载图像库中的所有图像 def loadImages(path): images = [] for filename in os.listdir(path): img = cv2.imread(os.path.join(path, filename)) if img is not None: images.append(img) return images # 对查询图像进行检索 def searchImage(query, images): # 计算查询图像的直方图 queryHist = calcHist(query) # 计算每幅图像与查询图像的相似度 similarities = [] for img in images: hist = calcHist(img) similarity = calcSimilarity(queryHist, hist) similarities.append(similarity) # 返回相似度最高的图像 index = np.argmax(similarities) return images[index] # 加载图像库中的所有图像 images = loadImages("path/to/image/folder") # 读取查询图像 query = cv2.imread("path/to/query/image") # 对查询图像进行检索 result = searchImage(query, images) # 显示结果图像 cv2.imshow("result", result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码中,`calcHist`函数用于计算图像的直方图,`calcSimilarity`函数用于计算两个直方图之间的相似度,`loadImages`函数用于加载图像库中的所有图像,`searchImage`函数用于对查询图像进行检索。通过调用这些函数,可以实现基于直方图图像检索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值