图像文件

2024-05-23

图像文件(精选6篇)

图像文件 篇1

摘要:在诸多领域中,经常需要把大量文件碎片拼接成一个或几个完整文件。若通过手工进行拼接,费时费力,并且也不能保证得到较好的复原物体。因此,结合图像处理技术完成文件碎片复原,既具有极大的理论意义,又有广泛的应用背景。

关键词:图像处理,文件碎片复原,拼接,边界匹配,像素提取

一、引言

随着研究深入,对于文件碎片拼接也涌现出了许多研究方法,一些文献也进行了描述。本文主要讨论的是结合图像处理技术完成文件碎片复原,主要涉及图像分割、轮廓特征提取、轮廓表示方法等相关领域,并且将计算机视觉、多维信号处理和图像处理技术等紧密结合在一起。阐述了对于不同类型文件碎片复原的处理方法,并在一些方法中加入文字特征的分类算法和像素匹配算法,结合最优化思想,使复原程度尽可能高,人工干预尽可能少。

二、基于文字的文件碎片处理方法

对碎片进行预处理扫描:对于单面印刷的文件碎片,保证碎纸片被扫描的一面在原始位置中属于同一面。对于双面印刷的文件碎片,要扫描碎片两面的信息,并且信息对应于哪面要标记清楚。为处理方便,同一次扫描使用相同的背景颜色。

1、针对纵切的规则的单面印刷文件碎片

(1)法一:

将图片格式的碎纸片图以灰度值矩阵A(k)的形式存储,

再将灰度值矩阵转化为0-1矩阵C(k),其中

(其中英文仅考虑四线三格最中间一格,这是为减小误差)。再基于上述0-1矩阵,提取出每幅图片左右边界0-1值,存于B(k)的第一、二列中,

运用左右边界匹配法,即基于纵向和横向规则切割特性:两相邻碎片中第一幅的右边界上文字和第二幅的左边界上文字多数来自同一汉字或英文字母,两邻接图片的边界的差异度小,分别做差计算,选取差异度最小的匹配。(以碎片k和s为例)这样得到右边界最佳匹配

(2)法二:

目标函数为minf(π),这样一来哈密尔顿路径求得的是全局最优解,即最佳匹配。

2、针对既横切又纵切的单面印刷文件碎片

(1)法一:由于横切纵切切割了两次,所以采用二层筛选的方法,并加入了k-means聚类算法(即接受输入量k,将n个数据对象划分为k个聚类,使所获得的聚类满足同一聚类中对象相似度较高,不同聚类相似度较小)

第一层做行位置筛选,读取图片的像素行,存入碎片的特征列向量中,并将此列向量作为行特征的唯一标识,将列向量元素差异最小的图片聚类,分别将中文和英文的归类。然后通过人为干预实现类的合并,将中英文都聚成同样数目的类,每一类包含相同张数的碎片。构建行内碎片的左右边界匹配模型,最终确定出每类内部碎片的排序。第二层做列位置筛选,建立上下边界匹配模型(与左右边界匹配法类似)得出各行的上下位置序列,经过两层筛选,得出原碎片序列。

除前方法外,需要构建中文特征灰度条向量

和英文特征灰度条向量(只考虑英文的中格部分),

建立特征匹配模型(以碎片k和s为例),

当特征值属于合适小的置信区间时,即Wk,s∈[a,b]时,认为两碎片在同一行。

(2)法二:法二则需加入基于文本行特征的碎片行分组,行分组方法类似于法一中对英文的分组方法,对行分组碎片进行横向拼接得到复原的碎片行,再对碎片行进行纵向拼接,得到复原结果。

3、针对既横切又纵切的双面印刷文件碎片

(1)法(一):由于双面我们需要进行两次特征匹配,一次是碎片k与s的a面,另一次是碎片k的b面与碎片s的a面。得到a面和b面的特征列向量。综合两次特征匹配结果,以及左右和上下边界匹配模型,加入人工干预,根据文件碎片内容以及文字边缘是否契合,得到正确碎片匹配序列。

(2)法(二):因为两面,故匹配距离需替换为两面的匹配距离之和。在对碎片行做纵向拼接minfk(π)k=1,2,...,nr时,将基于旅行商问题的拼接策略扩展为多旅行商(两个旅行商)问题的拼接策略,即一条旅行商路径代表纸张一面,另一条代表另一面,目标函数变为

其中,当k=1,2,...,nr时fk(π)为横向旅行商问题的目标函数,其匹配距离为正反面碎片边界横向匹配距离,当k=nr+1时fk(π)为纵向旅行商问题的目标函数,其匹配距离为正反面碎片边界复合匹配距离。

二、对于文字的不规则的文件碎片拼接方法

1、斜切情况。

我们设想找到平行于碎片中文字的直线斜率,找到图片1-x列,每一列最上面像素值为0的点,从x个点中选出最上面的点。同理得到个(m-x)-m(m为碎片图的宽度)列中处于最上面像素值为0的点。由这两个点得到平行于碎片中文字方向直线,再根据找到直线的斜率对碎片进行角度调整,最后用同规则碎片的方法进行匹配。

2、无规则情况。

利用形状匹配法,提取碎纸片轮廓线,通过边界和面积准则判断两轮廓是否匹配。在这里我们参考了贾海燕[1]女士研究的一种碎纸自动拼接中的形状匹配方法。设想给定两个碎片,确定两碎片轮廓形状之间是否存在匹配部分,选择任意一个碎片,把它放在参考坐标系中,称为固定碎片,并选定一个比较长度。

Step1:固定碎片从最高点象素开始取一组长度的象素作为固定链,在另一个将要进行比较的碎片上最高点开始取相同定长叫做旋转链,将旋转链剩余象素进行旋转和平移,固定链所取定长上最后几个象素的垂线和旋转链相交。重复步骤,直到每个象素都进行过匹配。

Step2:再进行碎片旋转。一个碎片在任意旋转一定角度之后,这个碎片的轮廓保持和它的方位相对应。假如选择一度一旋转,那么这个碎片必须在参考坐标系里旋转360个位置,每个轮廓都是有可能匹配的位置。

Step3:运用最优匹配算法,即先取定一个碎片确定固定链,长度m,再取另一碎片确定旋转链,长度仍为m。经过旋转和平移,使这两个碎片满足边界和面积匹配准则。

Step4:进行文件碎片拼接优化,将这两个已经匹配好的碎片作为一个新的固定碎片,用第三个碎片进行匹配,方法同上,并微调第二个碎片,使其位置更合理。

Step5:依次进行直到复原完整。

三、对于图片的不规则文件碎片拼接[3]

我们主要研究运用特征点匹配的快速图像拼接算法。首先对图像进行预处理。然后,采用Harris特征点提取的方法,对待拼接图像进行特征点的提取,利用基于灰度互相关的方法对图像进行初匹配。其次,用基于欧氏距离的聚类预筛选算法,主要依据匹配点对之间的欧氏距离相同或相近这一特点,通过简单聚类的方法筛选出包含欧氏距离值点最多的邻域,则可认为该邻域内的距离值是匹配点对;反之,则认为是不匹配点对从候选匹配点对集中剔除,并运用RANSAC算法对匹配点集进行精确匹配。最后运用基于LM加权融合与拉普拉斯金字塔相结合的图像融合算法,有效消除拼接缝及亮度突变现象,以实现图像的无缝平滑拼接。

四、对于含表格线的不规则文件碎片拼接方法

我们希望利用文字行特征[2]和表格线的方向来拼接形状相似的文件碎片。先对文件碎片进行二值化处理,获取文字边界,进而获取文字行方向、间距、高度等文字行特征。如果有英文汉字,应将英文单词图像拆分成类汉字图像,即将英文单词图像分割成宽度与高度近似的类汉字图像。

以碎片某点作为坐标原点,水平方向作为X轴方向,垂直方向作为Y轴方向,在[-90°,90°]范围内等角取60个方向,再将每个选定方向作为新坐标系的X轴方向,求原像素点。坐标变换后新坐标如果不是整数,则按4舍5入法取值。像素点在新坐标系下只改变坐标值,其颜色属性不变。再求新坐标系下碎纸片边缘的最高点和最低点坐标,从最低点开始给每行(具有相同Y坐标)从1开始编号,计算每行的白点个数、红点个数、宽度(像素个数)。根据每行的红点、白点个数及碎片宽度计算该方向的文字图像个数总数以及文字行行高总和,并按从大到小排列,选文字图像个数最多、文字行行高和最小的方向作为碎片的文字行方向。

一般碎片内表格线的方向与文字行方向平行,且只沿一个方向分布,可采用类似于文字行方向的扫描方法获取表格线方向。再将碎片按此方向重新放置,此后文字方向可能朝上或朝下,故加入人工干预进行图片翻转。将两碎片按文字行方向线位置对齐,然后计算文字行方向线或表格线与碎片边界的交点与处于同一水平位置的另一个碎片交点的距离。若两碎片在拼接位置对齐,则点与对应点距离相等,拼接后与对应点变为同一点。若未对齐,则其距离相等的连续点的个数比对齐位置的要少。

参考文献

[1]贾海燕,朱良家,周宗潭,胡德文,一种碎纸自动拼接中的形状匹配方法,(国防科学技术大学机电工程与自动化学院自动控制系,长沙湖南410073)

[2]罗智中,基于文字特征的文档碎纸片半自动拼接,计算机工程与应用,2012,48(5),207

[3]韩松卫,于明,运用特征点匹配的图像快速拼接算法研究,河北工业大学,控制科学与工程

图像文件 篇2

在用Windows 7的时候,如果你有留意,会发现选择中等图标、大图标、超大图标显示时,都会直接显示图片的缩略图,即使选择“详细”或“列表”的显示模式,在选中图片文件时,仍然会在预览区域显示缩略图,无形之中占用了很大一部分的系统资源,

其实,Windows 7完全可以设置只显示图像文件的图标,而不是显示缩略图,

请打开资源管理器,依次选择“组织/文件夹和搜索选项”,此时会打开“文件夹选项/常规”对话框,切换到“查看”选项卡,在这里勾选“始终显示图标,从不显示缩略图”复选框,最后单击“应用”或“确定”按钮即可生效。现在即使以超大图标显示,也不会显示出图像文件的缩略图效果。

图像文件 篇3

1 MFC类库及程序使用的相关函数介绍

微软基础类库 (Microsoft Foundation Classes Library) , 简称MFC, 是微软公司在C++编程语言的基础上实现的一个基础类库, 它是一种面向对象的函数库。在这个类库中, 封装了Windows操作系统关于窗口式用户接口的基础函数, 这样程序开发者就不必再编写大量复杂的窗口响应实现代码, 只需编写具体功能实现程序即可。这样做免去了大量繁重的重复性工作, 使得基于Windows操作系统的应用程序开发变得简单、快捷, 大大缩短了程序开发的周期。

MFC搭建了一个应用程序框架, 我们需要做的只是根据具体的应用场景选择合适的框架, 并且为框架填充具有实际用途的内容。同时, MFC还为我们提供了很多辅助资源, 例如向导、图标、位图等, 让开发者可以编写出用户友好度较高的界面接口应用程序。

MFC类库奉行单继承的风格, 所以, 其所有的类都继承自一个唯一的根类, 即CObject。CFile类继承自CObject类, 是以二进制的方式读取和写入文件的类。CFile类封装了Win32环境下的文件创建、文件读写等文件操作相关函数。CFile类的主要方法有: (1) CFile, 一个路径和文件句柄构造一个CFile对象; (2) Read, 将文件读取到一块缓存上; (3) Write, 将缓存中的数据写入指定文件中等。

文中用到的函数主要有以下两种。

1.1 文件类构造函数CStdio File

文件类构造函数CStdio File (LPCTSTR lpsz File Name, UINT n Open Flags) , 其中, 第一个参数为创建文件的文件名, 第二个参数则为文件打开模式。常用的模式有4种: (1) CFile::mode Read以只读的方式打开; (2) CFile::mode Write则以可写的方式打开; (3) CFile::mode Read Write以读写方式打开; (4) CFile::mode Create创建并打开。以上模式均可组合使用, 并用“|”相互隔开。

1.2 CArchive::Write

CArchive::Write (const void*lp Buf, UINT n Max) , 向文件中写入字符串, 参数1是一个向用户提供缓存的指针, 该缓存包含需要写入文件中的数据;参数2为一个无符号的整数, 用于表示写入数据的字节数。

CFile Find类是MFC中用作搜索文件的类。CFile Find类不但可用于搜索本地文件, 也可以用于搜索网络文件。通过向其传递文件名和文件路径等参数, 即可实现文件的搜索功能。CFile Find类的主要方法有以下4种: (1) CFile Find, 构造CFliefind对象; (2) Get File Name, 可以获取搜索到带有扩展名的相关文件; (3) Get File Path, 可以获取搜索到的文件的路径; (4) Find Next File, 继续先前的搜索调用等。

本文文件搜索功能主要是基于CFile和CFile Find两个基类实现的。

2 基于文件搜索功能的图像融合程序

2.1 设计思路

该程序是通过调用控制台应用程序enblend, 利用enblend自带的图像融合功能, 对两幅或两幅以上的图像进行融合。图像融合不是本文的讨论重点, 所以不在此赘述, 有兴趣的读者可以查阅相关资料。

调用一个控制台应用程序的方法有很多, 比如, 在VC中直接通过调用函数实现, 但是, 这种方法在需要传递复杂参数或数据量较大的情况下, 会出现调用失败或者运行时间过长的情况, 甚至会因为占用太多内存而出现系统崩溃的状况, 使得简单问题复杂化。最简单的调用方法就是新建一个bat批处理文件, 通过运行批处理文件达到调用控制台程序的目的。这种方法方便、快捷, 在处理大量数据时尤为高效, 但是, 每次调用都需要手动重新编写批处理文件, 费事费力而且容易出错。因此, 现在的问题就转变为如何设计一个用户界面, 让用户只需要点击鼠标即可完成创建bat文件并调用控制台程序的过程。

2.2 实现流程

该程序的开发环境为Visual C++6.0, 利用MFC创建一个对话框应用程序, 通过点击对话框按钮实现此程序的功能。

要实现程序功能的具体做法是:新建一个MFC App Wizard工程文件, 文件名可以取为“Find Img”, 选择基本对话框应用程序类型, 点击完成。在生成的对话框界面上, 新建一个编辑框和两个按钮, 两个按钮的名称分别修改为“选择文件夹”“融合图像”。编辑框用于显示所选取文件夹的路径;“选择文件夹”按钮用于选取图像所在的文件夹, 并搜索该文件夹下的所有图片文件, 然后将其写入bat文件;“融合图像”按钮用于运行bat文件, 调用enblend对图像进行融合。

搜素图片文件功能的实现的步骤是双击“选择文件夹”按钮, 添加代码如下 (//后为对该行代码的解释) :

编写完以上全部源代码后, 便可以编译运行程序, 点击“选择文件夹”按钮便可以搜索获取任意文件夹下的所有图片, 并将其传递给enblend图像融合程序。点击“图像融合”按钮, 便可调用enblend程序完成图像融合的过程。实验证明, 该程序操作简单, 运行性能良好, 在数据量较大的情况下, 运行速度依然较快。

3 总结

本文着重讨论了基于文件搜索功能下图像融合程序的实现过程, 事实上, 基于文件搜索功能可以实现很多具有其他功能的程序, 文中的图像融合只是其中一个方面的应用。因为绝大多数的应用程序都需要读入文件数据来实现自身的实际功能, 文件搜索功能可以实现程序读入文件数据的自动化, 极大地提高了应用程序的工作效率和用户友好度, 所以说, 该程序值得开发者广泛应用。

参考文献

图像文件 篇4

这要从电视信号的扫描格式说起。我们知道, 电视信号采用的是隔行扫描方式, 以我国目前的标清电视制式为例, 采用的是625/50i, 其中i就表示隔行扫描。在标清制式中, 电视信号每秒为25帧 (25幅图像) 每帧625行, 其中单数行由奇数场产生, 偶数行由偶数场产生。电视传送过程中, 每帧图像先传送奇数场, 再传送偶数场, 最终在电视屏幕上形成完整的图像。由于奇偶场是按先后次序传送的, 就会出现一个现象:对于运动图像来说, 由于偶数场在奇数场之后传送, 在这期间, 图像已经发生了变化, 因此就会造成奇数场和偶数场图像不一样的情况。从整帧图像上看, 会有一个奇特的现象, 奇数行的图像是一个位置, 偶数行的图像在另一个位置 (因为在传送偶数场时, 图像位置已经发生了变化) 。

由于奇偶场图像不同, 结果造成合成的完整帧图像是两个图像, 看起来有些怪。但是, 正是因为不同的奇偶场图像真实地反映了活动物体的运动, 因此就保证了电视中看到的物体运动的平滑性。反之, 如果奇偶场的内容是一样的, 则不能真实反映出物体在当前场的位置状况, 就会造成图像的停顿, 看起来不平滑, 而这正是前述电脑动画Logo在电视上看不平滑的原因。

我们知道, 目前的动画Logo都是由电脑用三维动画软件生成的, 而电脑的显示方式是逐行扫描方式, 并不存在奇偶场问题, 因此, 由电脑生成的每一帧动画图像都是单一的完整图像。这些图像导入到切换台片段存储器或字幕机动画生成器时, 切换台和字幕机却是按照电视帧来处理每一幅图像文件的。即将电脑图像中的单数行生成奇数场, 偶数行生成偶数场, 而后按照电视扫描规律进行播放。由于电脑生成的逐行扫描图像并未区分奇偶场, 因此, 其奇数行和偶数行的图像是完全一样的, 经过切换台或字幕机转换后, 就造成了产生的电视Logo中奇数场和偶数场是完全一样的, 直到下一个奇数场时, 图像才会发生变化。最后造成的观看效果是:图像每隔一场会停顿一下, 图像的运动不够平滑。

要想解决这个问题, 就需要让偶数场出不同的信号, 就是说需要将加倍生成图像, 比如原来1秒钟生成25帧图像, 则现在需要生成50幅图像, 其中奇数序号的图像用来生成奇数场信号, 偶数序号的图像用来生成偶数场信号。

那么, 如何才能将图像文件按场应用到电视信号中呢?目前, 无论是切换台的片段存储器, 还是字幕机的动画播放器, 大都不具备按场生成电视信号的特性, 它们只能按帧存储并播放动画文件序列, 如果将加倍生成的动画文件输给存储器或生成器, 只是产生了仍以帧播放的、时长加倍的动画。有的切换台具备倍速播放片段的能力, 因此可以将加倍时长的片段以倍速播放, 这样在倍速播放时, 就能形成奇偶场不同的平滑的动画。这种方法的代价是占用了加倍的存储空间, 而且播放动画时属非正常播放, 是一个不完美、但可实现的播放方法。

完美的应用发法是将加倍生成的动画序列进行加工, 生成新的动画序列, 新的序列图像中的每幅图像都来自于原来的相邻两幅图像, 新图像中奇数行的图像来自于原图像序列的奇数号图像, 偶数行的图像来自于原图像序列的偶数号图像。新生成的图像序列完全符合电视隔行扫描的特点, 应用到切换台片段存储器或字幕机动画播放器后, 就能够完美地再现平滑的动画了。

笔者自行编制了一个转换程序, 界面如图4。原理很简单, 从原图像序列中按序号读取连续两个图像文件, 再生成一个新的图像文件, 新图像的单数行像素来自第一个源文件, 偶数行像素来自于第二个源文件。重复循环, 直至将最后两个源文件转换成新文件, 生成的新图像序列就可以用于播放平滑动画了。

摘要:本文讲述了电脑动画软件生成的图像文件与隔行扫描电视帧的区别, 因此造成的后果, 以及将电脑帧文件转成电视帧文件的方法。

单幅图像中嵌入多文件的隐写方法 篇5

隐写术又称密写,可将任意数据(如文档、图像、网页等)隐藏于一般的载体(如图像、视频、声音等),然后通过网络传递嵌入数据后的载体。它可广泛应用于隐蔽通信、信息安全等方面,已成为当前研究热点之一。近年,基于图像的隐写算法研究主要集中在提高视觉保真度和嵌入容量,常用嵌入策略包括:(1)最低有效位(least significant bit, LSB)[3];(2)像素差分(pixel-value differencing, PVD)[4];(3)模操作[5];(4)隐写编码[6]。在应用方面,研究人员已开发出多种隐写工具[7],例如Hide and Seek、F5、OutGuess和Jpeg-Jsteg,运用这些工具可将一个文件嵌入一幅图像或多幅图像中,但不能将多个文件嵌入到一幅图像。随着高性能数字相机的普及,人们可获取的图像的分辨率越来越高,使得图像可嵌入的信息越来越多。由于一些数据文件的文件大小较小,因此将一个小文件嵌入高分辨图像后,图像中往往还有大量可嵌入信息的位置。如果丢弃这些位置不用,将会降低载体数据的利用率。为了提高利用率,本文提出一种可在单幅图像中嵌入多个文件的隐写方法。

1 隐写方法

为提高安全性,先用密钥对载体图像进行置乱加密[1],然后重新组织文件数据,在此基础上,用LSB替换策略[3]将组织后的数据嵌入到载体图像的最低比特位。嵌入完毕后,通过逆置乱得到最终含密图像。由于嵌入数据的组织格式是本文方法最为重要的组成部分之一,本文重点对其进行讲述。嵌入图像的数据可分为文件数据和控制数据两部分。其中,文件数据由各个文件的原始数据组成,控制数据则是为了能够准确提取文件数据而增加的辅助信息。如图1所示,载体图像可看成是一个矩形,从矩形左上角开始,按从上到下自左向右顺序访问像素,用LSB方法将文件数据嵌入到像素的最低比特位。与此同时,从矩形右下角开始,按从下到上自右向左顺序访问像素,用LSB方法嵌入控制数据。之所以将文件数据和控制数据嵌入在图像两端,这是因为用户事先难以准确知道载体图像可嵌入的文件数,在每次嵌入后,需重新计算剩余容量以确定后续可嵌入文件的大小。

文件数据的格式如图2所示。其中,File_Data_1为第1个嵌入文件的二进制数据,File_Data_2是第2个文件的二进制数据。依次类推,File_Data_n为第n个文件的二进制数据。执行嵌入时,先嵌入File_Data_1,其后紧接着嵌入File_Data_2,最后再隐藏File_Data_n。对于给定的一幅图像,可嵌入的总文件数n与每个嵌入文件的实际大小有关。通常,文件大小越小,可嵌入文件个数就越多,反之则越少。

图2 文件数据的格式

控制数据的格式如图3所示。其中,Embed_Mark为嵌入标记位,用1个字节表示,取值为1表示图像中有文件嵌入,其它值表示没有嵌入信息;File_Number表示图像中已嵌入的文件总数,用1个字节表示,因此最多可嵌入256个文件;File_Length_1表示第1个嵌入文件的比特总数,用4个字节表示,因此嵌入文件的字节数不能超过232/(1024×1024×8)=512兆;File_Extension_1用于保存第1个嵌入文件的后缀名,长度为4个字节。同理,File_Length_2和File_Length_n表示第2个和第n个嵌入文件的比特总数,而File_Extension_2和File_Extension_n则用于保存第2个和第n个嵌入文件的后缀名。嵌入操作时,先写入Embed_Mark,再嵌入File_Number,然后依次隐藏File_Length_1和File_Extension_1,紧接着嵌入File_Length_2和File_Extension_2,直至将File_Length_n和File_Extension_n嵌入完毕为止。

提取数据时,先用密钥对含密图像进行置乱,然后在置乱图像上提取LSB信息以还原每一个文件。具体如下:先读取标记位Embed_Mark,如果取值不等于1,说明图像没有嵌入文件,执行结束;否则表示图像中嵌入了文件。此时,读取嵌入文件总数File_Number,并根据此信息逐一提取每个文件。还原文件时,根据File_Length_1的值,从图像像素缓冲区首地址(如图1所示左上角)开始,提取File_Length_1个像素的LSB并重组成字节数据。接着,读取文件后缀名File_Extension_1并附加到给定文件名后,最终根据文件名输出重组字节数据即可还原第1个文件。由于第2个文件的数据紧接在第1个文件后,而第n个文件的数据则在第n-1个文件后,因此根据各个文件的大小和后缀名信息,逐一提取数据即可还原每个文件。

2 实验结果

实验中,用VC++6.0实现本文方法并设计出相应的隐写工具。本文用该工具验证本文方法的有效性。图4(a)为实验用的载体图像,格式为BMP,大小696×520;图4(b)、4(c)和4(d)是待嵌入的三个文件类型不同的文件,大小分别为336、9058和24064字节。运行隐写工具后,先打开载体图像并用密钥对其进行置乱加密,结果如图5(a)所示。在此基础上,执行文件嵌入操作,此时会弹出如图5(b)所示界面,提示选择要嵌入的文件。选择图4(b)的文件1后,将弹出如图5(c)所示的信息框,说明本次操作嵌入的字节数、载体图像剩余容量以及当前已嵌入文件数。重复执行文件嵌入操作,依次将图4中的文件2和文件3嵌入到图像中,图5(d)和5(e)为嵌入文件后的信息提示界面。嵌入完成后对图像逆置乱,得到最终含密图像,结果如图5(f)所示。

提取文件时,先打开含密图像,再用密钥对其置乱,然后执行文件提取操作,此时工具将弹出如图6(a)所示界面,说明当前提取的是第几个文件及其大小,选择“确定”按钮后,将要求用户选择文件名(后缀名由隐写工具给出)。如图6(b)所示,输入文件名后,单击“保存”按钮,工具将文件输出到指定文件。重复上述文件提取操作过程,便可得到另外两个嵌入文件,图6(c)和6(d)为提取另外两个文件时的提示界面。

3 结束语

本文提出一种可在单幅图像中嵌入多个文件的隐写方法。先置乱载体图像,再将多个文件的数据重新组织,然后用LSB方法嵌入数据,最后通过逆置乱得到含密图像。多个文件的数据组织格式是本文方法的一个重要组成部分。该数据格式独立于具体的嵌入策略,因此并不限于与LSB策略使用,可与其他嵌入策略结合。本文用VC++实现了该方法并设计出一个隐写工具,实验结果验证了方法的有效性和实用性。

参考文献

[1]Tang Z,Zhang X.Secure image encryption without size limitationusing Arnold transform and random strategies[J].Journal of Multi-media,2011,6(2):202-206.

[2]Moulin P,Koetter R.Data-hiding codes[J].Proceedings of theIEEE,2005,93(12):2083-2126.

[3]Chan C,Cheng L M.Hiding data in images by simple LSB substitu-tion[J].Pattern Recognition,2004,37(3):469-474.

[4]Wu D C,Tsai W H.A steganographic method for images by pixel-value differencing[J].Pattern Recognition Lett.,2003,24(9-10):1613-1626.

[5]Lee C F,Chen H L.A novel data hiding scheme based on modulusfunction[J].Journal of Systems and Software,2010,83(5):832–843.

[6]Zhang X,Wang S.Efficient steganographic embedding by exploitingmodification direction[J].IEEE Communications Letters,2006,10(11):781-783.

图像文件 篇6

基于上述考虑,为了拓展MATLAB的应用范围,增强程序的可移植性和通用性,本文介绍了一种如何利用MATLAB提供的一套可供Visual C++调用的API函数集来实现在Visual C++中访问MAT数据格式的三维扫描图像文件的方法。结合MATLAB强大的计算能力、VISUAL C++良好的用户接口与界面和OpenGL在三维图像的处理方面的优势来实现对三维图像的显示、操作与处理。作者使用的编译环境是:MS Visual C++6.0与MATLAB 7.0。

1 MAT文件格式与OpenGL简述

MAT文件是以二进制形式存储的数据文件,是MATLAB最主要的数据存储格式。MAT文件由一个128字节文件头与一个或者多个数据单元组成,每个数据单元又包含一个8字节的数据标签与一个数据(变量)块。文件头里保存着MATLAB的版本,创建平台、日期与时间的信息;数据标签中前四个字节是该数据单元中数据块的类型,后四个字节是该数据单元中数据块的长度。

OpenGL是SGI(Silicon Graphics,Inc.)公司开发的一个非常优秀的开放式、可独立于操作系统和硬件环境的三维图形软件库,早期主要应用在专业的图形工作站上。近几年随着微机硬件性能的显著提高,在微机中有广泛地应用。由于其开放性和高度可重用性目前已成为高性能图形和交互式视景处理的工业标准。

2 Visual C++编译环境的设置

Visual C++与MATLAB和Visual C++与OpenGL之间的连接都是通过动态连接库进行的,为了让Visual C++与MATLAB之间,Visual C++与OpenGL之间无缝的连接,必须对Visual C++的开发环境进行相应的设置。我们以在Visual C++中生成一个单文档工程为例进行说明。

2.1 Visual C++与MATLAB连接的编译环境设置

MATLAB提供的API函数集封装于下面两个标准DLL文件中:libmat.dll,libmx.dll。前者用于对MAT文件的操作,后者用于对MAT文件中矩阵的操作。它们的存放在MATLAT安装目录下的bin目录中,还有两个对应的导出库文件libmat.def与libmx.def,以及其导出函数的原型mat.h和matrix.h,它们都位于MATLAT安装目录下的include文件夹中。环境的设置只需一次,以后运行就不需要再进行设置了。首先在Visual C++中设置包含路径,选择菜单【Tools】→【Options】,在弹出的Options对话框中选择Directories标签,在该对话框中选择Include files选项,并在该文本框中添加D:MATLAB7EXTERNINCLUDE,接着选择Library files选项,并在该文本框中添加D:MATLAB7EXTERNLIBWIN32MICROSOFTMSVC60。我们假定MATLAB7安装在D盘的根目录下。然后在新建的工程的预编译头文件StdAfx.h包含mat.h与matrix.h两个头文件。最后设置编译器的链接选项,选择菜单【Project】→【Settings】,在弹出的Project Settings对话框中选择Link标签,在该对话框的Object/Library Modules文本框中加入libmat.lib与libmx.lib两个链接库。

2.2 Visual C++与OpenGL连接的编译环境设置

由于Visual C++6.0中已经包含了OpenGL的三个核心的动态链接库与对应的导出库文件,一般不需要设置包含路径。编译器的链接选项的设置与上面的方法相同,在Object/Library Modules文本框中加入OpenGL32.lib、gul32.lib与glaux.lib三个链接库即可。在预编译头文件StdAfx.h中加入gl/gl.h、glglu.h、glglaux.h和glglut.h四个头文件。

2.3 OpenGL图形绘制环境设置与编程步骤

OpenGL的绘图方式与Windows的一般的绘图方式是不同的,只要区别表现在以下3个方面[1]:

1)Windows采用的是GDI(Graphics Device Interface)绘图。

2)OpenGL采用的是渲染上下文RC(Render Context,又称渲染描述表)绘图。

3)OpenGL使用的是特殊的像素格式。

对于MFC AppWizard建立的单文档应用程序,进行OpenGL编程的步骤为:

1)编写创建函数(生成绘制描述表并设置当前绘制描述表)。

2)编写销毁函数,清除位图,定时器等资源及设备场景。

3)修改Cview类的样式。

4)编写OnDraw事件处理程序。

5)在OnSize方法中定义当前视区、投影模型和物体模型以及光源等。

6)编写OnTimer事件处理函数。

7)编写OpenGL绘制程序。

3 数据读取

在读取MAT数据之前,我们必须知道MAT数据中包含的变量名称,变量的类型以及变量数据块的大小。这些信息可以通过MATLAB提供的函数很容易的得到。我们以一个三维颅面扫描图像MAT文件格式的数据为例进行说明。这个MAT数据包含两个数据块,一个点坐标数据块,变量名是”Points”。另一个是三角形面片的点序数据块,变量名是“Facets”。两个数据块的数据类型都为双精度浮点型。根据这些信息,我们自定义了一个如下的结构体:

其中tVector3与tFacet也都是自定义结构体,定义分别如下:

数据读取的主要代码如下:

4 图像显示

图像的显示分为三个步骤,分别是各个三角面片法向量的计算,光照环境的设置与3D模型的绘制。法向量的计算与光照环境的设置在文献[1,2]里有详细的介绍。计算出的法向量保存在对象结构的法向量变量中。下面主要列出3D模型的绘制代码。

5 结束语

本文提出的这种方法使我们能把复杂的计算过程留给MATLAB,而用Visual C++结合OpenGL对计算结果进行分析和可视化处理。这样通过三者的紧密结合,很大程度上降低了编程的难度和工作量,缩短了软件的开发周期,提高了软件的可靠性。同时,本文的方法不仅仅只是限于3D扫描图像数据的读取,对于任何MAT数据格式的文件都是适合的,这必定能极大的拓展MATLAB的应用范围,无疑会给我们的科研和工作实践带来很大的便利和显著的经济效益。对于以上的方法,作者已经在自己的工作中成功的加以利用,实践证明该方法具有很强的可靠性与实用性。

摘要:介绍一种在VisualC++开发环境中,利用MATLAB的API函数集并结合OpenGL对MAT数据格式的三维扫描图像的读取与显示方法,并以三维扫描颅面图像为例,详细的说明了整个的实现过程。

关键词:OpenGL,Visual C++,MATLAB,三维扫描图像,MAT

参考文献

[1]和平鸽工作室.OpenGL三维图形系统开发与实用技术(基础编程篇)[M].北京:清华大学出版社,重庆:重庆大学出版社,2003.

[2]和平鸽工作室.OpenGL三维图形系统开发与实用技术(实用技术篇)[M].北京:清华大学出版社,重庆:重庆大学出版社,2003.

[3]张威.MATLAB外部接口编程[M].西安:西安电子科技出版社,2004.

上一篇:公共服务理论下一篇:形态边缘检测