二值图像信息隐藏-游程编码
游程编码(蛮详细的)
摘要为了减少信源输出符号序列中的剩余度、提高符号的平均信息量,对信源输出的符号序列所施行的变换。
具体说,就是针对信源输出符号序列的统计特性来寻找某种方法,把信源输出符号序列变换为最短的码字序列,使后者的各码元所载荷的平均信息量最大,同时又能保证无失真地恢复原来的符号序列。
最原始的信源编码就是莫尔斯电码,另外还有ASCII码和电报码都是信源编码。
但现代通信应用中常见的信源编码方式有:Huffman编码、算术编码、L-Z编码,这三种都是无损编码,另外还有一些有损的编码方式。
信源编码的目标就是使信源减少冗余,更加有效、经济地传输,最常见的应用形式就是压缩。
相应地,信道编码是为了对抗信道中的噪音和衰减,通过增加冗余,如校验码等,来提高抗干扰能力以及纠错能力。
关键词:信源;信道;编码;游程编码1课题描述游程编码又称“运行长度编码”或“行程编码”,是一种统计编码,该编码属于无损压缩编码,是栅格数据压缩的重要编码方法。
对于二值图有效。
在对图像数据进行编码时,沿一定方向排列的具有相同灰度值的像素可看成是连续符号,用字串代替这些连续符号,可大幅度减少数据量。
相应地,信道编码是为了对抗信道中的噪音和衰减,通过增加冗余,如校验码等,来提高抗干扰能力以及纠错能力。
2 信源编码2.1概念一种以提高通信有效性为目的而对信源符号进行的变换;为了减少或消除信源剩余度而进行的信源符号变换,对输入信息进行编码,优化信息和压缩信息并且打成符合标准的数据包2.2信源编码作用信源编码的作用之一是设法减少码元数目和降低码元速率,即通常所说的数据压缩:作用之二是将信源的模拟信号转化成数字信号,以实现模拟信号的数字化传输。
2.3编码方式最原始的信源编码就是莫尔斯电码,另外还有ASCII码和电报码都是信源编码。
但现代通信应用中常见的信源编码方式有:Huffman编码、算术编码、L-Z编码,这三种都是无损编码,另外还有一些有损的编码方式。
信源编码的目标就是使信源减少冗余,更加有效、经济地传输,最常见的应用形式就是压缩。
二值图像及其编码
二值图像及其编码3.1 二值图像及其特征图像分为彩色图像和灰度图像两大类,二值图像就是只有黑白两种灰度级的特殊灰度图像,例如文件、气象图、工程图、指纹卡片、手写文字、地图、报纸等等。
此外,为了报纸的印刷,即使原来为灰度的图像,也要做成网纹的二值图像;传真只能一点一点地传送二值数据,也要把灰度的图像转化为二值的图像。
二值图像信源编码的目的和灰度图像的编码一样,也是为了减少表示图像所需的比特数。
除了只有黑白两个灰度外,二值图像还有一些其它的特征: 首先,在统计特性上,由于只有两种灰度,即只有两种信源符号,所以只对应两种信源概率P0和P1 ,且满足P1=1 一P0,也就是说信源符号的概率可以只用一种概率来表示;其次,图像数据量较小,单个像素既可以用其灰度值(例如0 和255)来表示,也可以用二进制值(0 和1)来表示,显然后一种表示方法在存储和对图像进行数据处理时会比较简便;此外,二值图像的结构也往往比较简单,黑、白像素区域多为连续分布、划分明显。
这些特征对于二值图像的压缩编码都具有重要的意义,大部分编码方法都是直接利用这些特征或者建立在这些特征的基础上的。
3.23.3 二值图像压缩的意义前面提到,由于灰度级别只有两种,所以用于表示二值图像的数据量本身就远小于同等尺寸的灰度图像和彩色图像。
但是,这并不意味着对它们就不必再进行压缩处理了。
二值图像同一般的图像一样,也有着很大的压缩空间。
如果每一像素用一位二进制码0 或1(白像素为1 ,黑像素为0)表示,则称为直接编码。
一位二进制码为1 比特,因而直接编码时表示一帧图像的比特数就等于该图像的像素数。
直接编码对数据量是没有压缩效果的,因而通常把直接编码得到数据比特数作为该二值图像的原始数据大小,例如,二值图像以Window: 操作系统中的标准图像文件BMP 格式存储就是这样一种情况。
由于二值图像结构和统计上的冗余特性,直接编码所形成的符号所携带的信息中必然包含了大量的冗余成分,所以,经过各种编码处理,去掉这些冗余成分,能够使表示二值图像的比特数小于该图像的像素数(即小于图像原始大小),达到压缩的目的。
二值图像分析
⼆值图像分析第三章⼆值图像分析⼀幅数字图像是⼀个⼆维阵列,阵列元素值称为灰度值或强度值.实际上,图像在量化成数字图像前是⼀个连续强度函数的集合,场景信息就包含在这些强度值中.图像强度通常被量化成256个不同灰度级,对某些应⽤来说,也常有32、64、128或512个灰度级的情况,在医疗领域⾥甚⾄使⽤⾼达4096(12bits )个灰度级.很明显,灰度级越⾼,图像质量越好,但所需的内存也越⼤.在机器视觉研究的早期,由于内存和计算能⼒⾮常有限,⽽且⼗分昂贵,因此视觉研究⼈员把精⼒主要集中在研究输⼊图像仅包含两个灰度值的⼆值视觉系统上.⼈们注意到,⼈类视觉在理解仅由两个灰度级组成的线条、轮廓影像或其它图像时没有任何困难,⽽且应⽤场合很多,这⼀点对研究⼆值视觉系统的研究⼈员是⼀个极⼤的⿎舞.随着计算机计算能⼒的不断增强和计算成本的不断下降,⼈们普遍开始研究基于灰度图像、彩⾊图像和深度图像的视觉系统.尽管如此,⼆值视觉系统还是⼗分有⽤的,其原因如下:⑴计算⼆值图像特性的算法⾮常简单,容易理解和实现,并且计算速度很快.⑵⼆值视觉所需的内存⼩,对计算设备要求低.⼯作在256个灰度级的视觉系统所需内存是⼯作在相同⼤⼩⼆值图像视觉系统所需内存的⼋倍.如若利⽤游程长度编码等技术(见3.4节)还可使所需内存进⼀步减少.由于⼆值图像中的许多运算是逻辑运算⽽不是算术运算,所以所需的处理时间很短.(3)许多⼆值视觉系统技术也可以⽤于灰度图像视觉系统上.在灰度或彩⾊图像中,表⽰⼀个⽬标或物体的⼀种简易⽅法就是使⽤物体模板(mask),物体模板就是⼀幅⼆值图像,其中1表⽰⽬标上的点,0表⽰其它点.在物体从背景中分离出来后,为了进⾏决策,还需要求取物体的⼏何和拓扑特性,这些特性可以从它的⼆值图像计算出来.因此,尽管我们是在⼆值图像上讨论这些⽅法,但它们的应⽤并不限于⼆值图像.⼀般来说,当物体轮廓⾜以⽤来识别物体且周围环境可以适当地控制时,⼆值视觉系统是⾮常有⽤的.当使⽤特殊的照明技术和背景并且场景中只有少数物体时,物体可以很容易地从背景中分离出来,并可得到较好的轮廓,⽐如,许多⼯业场合都属于这种情况.⼆值视觉系统的输⼊⼀般是灰度图像,通常使⽤阈值法⾸先将图像变成⼆值图像,以便把物体从背景中分离出来,其中的阈值取决于照明条件和物体的反射特性.⼆值图像可⽤来计算特定任务中物体的⼏何和拓扑特性,在许多应⽤中,这种特性对识别物体来说是⾜够的.⼆值视觉系统已经在光学字符识别、染⾊体分析和⼯业零件的识别中得到了⼴泛应⽤.在下⾯的讨论中,假定⼆值图像⼤⼩为n m ?,其中物体像素值为1,背景像素值为0.3.1 阈值视觉系统中的⼀个重要问题是从图像中识别代表物体的区域(或⼦图像),这种对⼈来说是件⾮常容易的事,对计算机来说却是令⼈吃惊的困难.为了将物体区域同图像其它区域分离出来,需要⾸先对图像进⾏分割.把图像划分成区域的过程称为分割,即把图像],[j i F 划分成区域k p p p ,,,21,使得每⼀个区域对应⼀个候选的物体.下⾯给出分割的严格定义.定义分割是把像素聚合成区域的过程,使得:==i ki P 1 整幅图像 (}{i P 是⼀个完备分割 ).●j i P P j i ≠?=, ,(}{i P 是⼀个完备分割).●每个区域i P 满⾜⼀个谓词,即区域内的所有点有某种共同的性质.●不同区域的图像,不满⾜这⼀谓词.正如上⾯所表明的,分割满⾜⼀个谓词,这⼀谓词可能是简单的,如分割灰度图像时⽤的均匀灰度分布、相同纹理等谓词,但在⼤多数应⽤场合,谓词⼗分复杂.在图像理解过程中,分割是⼀个⾮常重要的步骤.⼆值图像可以通过适当地分割灰度图像得到.如果物体的灰度值落在某⼀区间内,并且背景的灰度值在这⼀区间之外,则可以通过阈值运算得到物体的⼆值图像,即把区间内的点置成1,区间外的点置成0.对于⼆值视觉,分割和阈值化是同义的.阈值化可以通过软件来实现,也可以通过硬件直接完成.通过阈值运算是否可以有效地进⾏图像分割,取决于物体和背景之间是否有⾜够的对⽐度.设⼀幅灰度图像],[j i F 中物体的灰度分布在区间],[21T T 内,经过阈值运算后的图像为⼆值图像],[j i F T ,即:≤≤=其它如果0],[ 1],[21T j i F T j i F T (3.1) 如果物体灰度值分布在⼏个不相邻区间内时,阈值化⽅案可表⽰为:∈=其它如果0],[ 1],[Z j i F j i F T (3.2) 其中Z 是组成物体各部分灰度值的集合.图3.1是对⼀幅灰度图像使⽤不同阈值得到的⼆值图像输出结果.阈值算法与应⽤领域密切相关.事实上,某⼀阈值运算常常是为某⼀应⽤专门设计的,在其它应⽤领域可能⽆法⼯作.阈值选择常常是基于在某⼀应⽤领域获取的先验知识,因此在某些场合下,前⼏轮运算通常采⽤交互式⽅式来分析图像,以便确定合适的阈值.但是,在机器视觉系统中,由于视觉系统的⾃主性能(autonomy )要求,必须进⾏⾃动阈值选择.现在已经研究出许多利⽤图像灰度分布和有关的物体知识来⾃动选择适当阈值的技术.其中的⼀些⽅法将在3.2节介绍.图3.1 ⼀幅灰度图像和使⽤不同阈值得到的⼆值图像结果.上左:原始灰度图像,上右:阈值T=100;左下:T=128.右下:T1=100|T2=128.3.2 ⼏何特性通过阈值化⽅法从图像中检测出物体后,下⼀步就要对物体进⾏识别和定位.在⼤多数⼯业应⽤中,摄像机的位置和环境是已知的,因此通过简单的⼏何知识就可以从物体的⼆维图像确定出物体的三维位置.在⼤多数应⽤中,物体的数量不是很多,如果物体的尺⼨和形状完全不同,则可以利⽤尺度和形状特征来识别这些物体.实际上在许多⼯业应⽤中,经常使⽤区域的⼀些简单特征,如⼤⼩、位置和⽅向,来确定物体的位置并识别它们.3.2.1 尺⼨和位置⼀幅⼆值图像区域的⾯积(或零阶矩)由下式给出:∑∑-=-==1010],[n i m j j i B A (3.3)在许多应⽤中,物体的位置起着⼗分重要的作⽤.⼯业应⽤中,物体通常出现在已知表⾯(如⼯作台⾯)上,⽽且摄像机相对台⾯的位置也是已知的.在这种情况下,图像中的物体位置决定了它的空间位置.确定物体位置的⽅法有许多,⽐如⽤物体的外接矩形、物体矩⼼(区域中⼼)等来表⽰物体的位置.区域中⼼是通过对图像进⾏“全局”运算得到的⼀个点,因此它对图像中的噪声相对来说是不敏感的.对于⼆值图像,物体的中⼼位置与物体的质⼼相同,因此可以使⽤下式求物体的中⼼位置:∑∑∑∑∑∑∑∑-=-=-=-=-=-=-=-=-==1010101010101010],[],[],[],[n i n i m j m j n i m j n i m j j i iB j i B y j i jB j i B x (3.4)其中x 和y 是区域相对于左上⾓图像的中⼼坐标.物体的位置为: Aj i iB y Aj i jB x n i m j n i m j ∑∑∑∑-=-=-=-=-==10101010],[],[ (3.5)这些是⼀阶矩.注意,由于约定y 轴向上,因此⽅程3.4和3.5的第⼆个式⼦的等号右边加了负号. 3.2.2 ⽅向计算物体的⽅向⽐计算它的位置稍微复杂⼀点.某些形状(如圆)的⽅向不是唯⼀的,为了定义唯⼀的⽅向,⼀般假定物体是长形的,其长轴⽅向被定义为物体的⽅向.通常,⼆维平⾯上与最⼩惯量轴同⽅向的最⼩⼆阶矩轴被定为长轴.图像中物体的⼆阶矩轴是这样⼀条线,物体上的全部点到该线的距离平⽅和最⼩.给出⼀幅⼆值图像],[j i B ,计算物体点到直线的最⼩⼆乘⽅拟合,使所有物体点到直线的距离平⽅和最⼩:χ220101==-=-∑∑r B i j ij j m i n [,] (3.6)其中r ij 是物体点],[j i 到直线的距离.为了避免直线处于近似垂直时所出现的数值病态问题,⼈们⼀般把直线表⽰成极坐标形式:θθρsin cos y x += (3.7)如图3.2所⽰,θ是直线的法线与x 轴的夹⾓,ρ是直线到原点的距离.把点),(j i 坐标代⼊直线的极坐标⽅程得出距离r :22)sin cos (ρθθ-+=y x r (3.8)图3.2 直线的极坐标表⽰将⽅程3.8代⼊⽅程3.6并求极⼩化问题,可以确定参数ρ和θ:∑∑-=-=-+=101022],[)sin cos (n i m j ij ij j i B y x ρθθχ (3.9) 令2χ对ρ的导数等于零求解ρ得:)sin cos (θθρy x += (3.10) 它说明回归直线通过物体中⼼),(y x .⽤这⼀ρ值代⼊上⾯的2χ,则极⼩化问题变为:θθθθχ222sin cos sin cos c b a ++= (3.11)其中的参数: ],[)(],[))((2],[)(10210101010102j i B y y c j i B y y x x b j i B x x a n i m j ij n i m j ij ij n i m j ij ∑∑∑∑∑∑-=-=-=-=-=-=-=--=-= (3.12)是⼆阶矩.表达式2χ可重写为:θθχ2sin 212cos )(21)(212b c a c a +-++=(3.13) 对2χ微分,并置微分结果为零,求解θ值:ca b -=θ2tan (3.14) 因此,惯性轴的⽅向由下式给出:2222)(2cos )(2sin c a b ca c ab b -+-±=-+±=θθ (3.15) 所以由2χ的最⼩值可以确定⽅向轴.注意,如果c a b ==,0,那么物体就不会只有唯⼀的⽅向轴.物体的伸长率E 是2χ的最⼤值与最⼩值之⽐:minmax χχ=E (3.16) 3.2.3 密集度和体态⽐区域的密集度(compact )可⽤下⾯的式⼦来度量:2pA C = (3.17) 其中,p 和A 分别为图形的周长和⾯积.根据这⼀衡量标准,圆是最密集的图形,其密集密度为最⼤值π4/1,其它⼀些图形的⽐值要⼩⼀些.让我们来看⼀下圆,当圆后仰时,形状成了⼀椭圆,⾯积减⼩了⽽周长却不象⾯积减⼩的那么快,因此密集度降低了.在后仰到极限⾓时,椭圆被压缩成了⼀条⽆限长直线,椭圆的周长为⽆穷⼤,故密集度变成了零.对于数字图像, 2p A 是指物体尺⼨(像素点数量)除以边界长度的平⽅.这是⼀种很好的散布性或密集性度量⽅法.这⼀⽐值在许多应⽤中被⽤作为区域的⼀个特征.密集度的另⼀层意义是:在给定周长的条件下,密集度越⾼,围成的⾯积就越⼤.注意在等周长的情况下,正⽅形密集度⼤于长⽅形密集度.体态⽐定义为区域的最⼩外接矩形的长与宽之⽐,正⽅形和圆的体态⽐等于1,细长形物体的体态⽐⼤于1.图3.3所⽰的是⼏种形状的外接矩形.图3.3 ⼏种外接矩形⽰意图 3.3 投影给定⼀条直线,⽤垂直该直线的⼀簇等间距直线将⼀幅⼆值图像分割成若⼲条,每⼀条内像素值为1的像素个数为该条⼆值图像在给定直线上的投影(projection ).当给定直线为⽔平或垂直直线时,计算⼆值图像每⼀列或每⼀⾏上像素值为1的像素数量,就得到了⼆值图像的⽔平和垂直投影,如图3.4所⽰.由于投影包含了图像的许多信息,所以投影是⼆值图像的⼀种简洁表⽰⽅式.显然,投影不是唯⼀的,同样的投影可能对应不同的图像.图3.4 ⼀幅⼆值图像及其⽔平投影图在某些应⽤中,投影可以作为物体识别的⼀个特征.投影既是⼀种简洁的图像表⽰,⼜可以实现快速算法.下⾯介绍对⾓线投影的求解⽅法.对⾓线投影的关键是计算当前⾏和列对应的投影分布图位置标号.设⾏和列的标号分别⽤i 和j 表⽰.若图像矩阵为n ⾏m 列,则i 和j 的范围分别为0到1-n 和0到1-m .假设对⾓线的标号d ⽤⾏和列的仿射变换(线性组合加上常数)计算,即:c bj aid ++= (3.18) 对⾓线投影共对应1-+m n 个条,其中仿射变换把右上⾓像素映射成对⾓线投影的第⼀个位置,把左下⾓像素映射成最后⼀个位置,如图3.5所⽰,则当前⾏列对应的标号d 的公式为:1-+-=m j i d (3.19)图3.5 ⼆值图像及其对⾓线上的投影图3.4 游程长度编码游程长度编码(run-length encoding)是另⼀种⼆值图像的简洁表⽰⽅法,它是⽤图像像素值连续为1的个数(像素1的长度)来描述图像.这种编码已被⽤于图像传输.另外,图像的某些性质,如物体区域⾯积,也可以从游程长度编码直接计算出来.在游程长度编码中经常运⽤两种⽅法,⼀种是使⽤1的起始位置和1的游程长度,另⼀种是仅仅使⽤游程长度,但须从1的游程长度开始描述,如图3.6所⽰.1的游程(2,2)(6,3)(13,6)(20,1)(4,6)(11,10)(1,5 )(11,1)(17,4)1和0的游程长度:0,2,2,3,4,6,1,10,3,6,1,105,5,1,5,4图3.6 ⼀幅简单⼆值图像的游程长度编码.如果⽤第⼆种⽅法来表⽰图像每⾏的游程长度,并⽤k i r ,代表图像第i ⾏的第k 个游程长度,则全部1的游程长度之和就是所求物体的⾯积.∑∑-=-=+=1021012,n i m k k i i r A (3.20)其中i m 是第i ⾏游程个数,2/)1(-i m 取整,表⽰1的游程个数.由游程长度编码能很容易地计算⽔平投影⽽⽆需变成原来的图像.使⽤更巧妙的⽅法也能从游程长度编码计算出垂直和对⾓线投影.3.5 ⼆值图像算法从背景中分离出物体是⼀个困难的问题,在此将不讨论这个问题.这⾥假设物体可以从背景中分离,并且使⽤某⼀谓词,可以对图像中属于物体的点进⾏标记.因此,问题就变为如何将⼀幅图像中所有被标记的点组合成物体图像.这⾥还假设物体点在空间上是⾮常接近的.利⽤空间接近概念可以严格定义,利⽤此定义研究的算法可以把空间上⾮常接近的点聚合在⼀起,构成图像的⼀个成分(component ).下⾯⾸先引进⼀些定义,然后讨论有关算法.3.5.1 定义(1) 近邻在数字图像中,⼀个像素在空间上可能⾮常接近其它⼀些像素.在⽤⽅格表⽰的数字图像中,⼀个像素与其它四个像素有公共边界,并与另外四个像素共享顶⾓.如果两个像素有公共边界,则把它们称为4-近邻(4-neighbors).同样,如果两个像素⾄少共享⼀个顶⾓,则称它们为8-近邻.例如,位于],[j i 的像素有四个4-近邻:],1[j i -,],1[j i +,]1,[-j i ,]1,[+j i .它的8-近邻包括这四个4-近邻,再加上]1,1[--j i ,]1,1[-+j i ,]1,1[+-j i ,]1,1[++j i .⼀个像素被认为与它的4-近邻是4-连通(4-connected)关系,与它的8-近邻是8-连通关系(如图3.7).图3.7 矩形像素⽹格的4-近邻和8-近邻⽰意图.像素],[j i 位于图的中⼼.(2) 路径从像素],[00j i 到像素],[n n j i 的路径(path)是指⼀个像素序列],[00j i ,],[11j i ,..., ],[n n j i ,其中像素],[k k j i 是像素],[11++k k j i 的近邻像素,10-≤≤n k .如果近邻关系是4-连通的,则路径是4-路径;如果是8-连通的,则称为8-路径.图3.8即为路径的两个简单例⼦.图3.8 4-路径和8—路径⽰意图(3) 前景图像中值为1的全部像素的集合称为前景(foreground),⽤S 表⽰.(4) 连通性已知像素S q p ∈,,如果存在⼀条从p 到q 的路径,且路径上的全部像素都包含在S 中,则称p 与q 是连通的.注意,连通性(connectivity)是等价关系.对属于S 的任意三个像素p 、q 和r ,有下列性质:1.像素p 与p 本⾝连通(⾃反性).2.如果p 与q 连通,则q 与p 连通(互换性).3.如果p 与q 连通且q 与r 连通,则p 与r 连通(传递性).(5) 连通成份⼀个像素集合,如果集合内的每⼀个像素与集合内其它像素连通,则称该集合为⼀个连通成份(connected component).[i-1, j ][i, j-1] [i, j ] [i, j+1][i+1, j ] [i-1,j-1] [i-1,j ] [i-1,j+1] [i,j-1] [i, j ] [i,j+1] [i+1,j-1] [i+1,j ] [i+1,j+1](6) 背景S(S的补集)中包含图像边界点的所有连通成份的集合称为背景(background).?S中所有其它元称为洞.考虑下⾯的两个图像.⾸先看左图中有⼏个洞和⼏个物体.如果从前景和背景来考虑4-连通,有四个⼤⼩为-个像素的物体和⼀个洞.如果考虑8-连通,那么有⼀个物体⽽没有洞.直观地,在这两种情况下出现了不确定性情况.右图为另⼀个类似的不确定问题.其中如果1是连通的,那么0就应该是不连通的.为了避免这种难以处理的情况,对物体和背景应使⽤不同的连通.如果我们对S使⽤8-连通,那么对?S就应使⽤4-连通.(7) 边界S的边界(boundary)是S中与?S中有4-连通关系的像素集合.边界通常记为S'.(8) 内部内部(interior)是S中不属于它的边界的像素集合.S的内部等于S-S'.(9) 包围如果从S中任意⼀点到图像边界的4-路径必须与区域T相交,则区域T包围(surrounds)区域S(或S在T内).图3.9即为⼀幅简单⼆值图像和它的边界、内部、包围⽰意图.图3.9 ,内部和包围3.5.2连通成份标记在⼀幅图像中找出连通成份是机器视觉中最常见的运算之⼀.连通区域内的点构成表⽰物体的候选区域.机器视觉中的⼤多数物体都有表⾯,显然,物体表⾯点投影到图像平⾯上会形成空间上密集的点集.这⾥应该指出,连通成份算法常常会在⼆值视觉系统中形成瓶颈效应,原因是连通成份运算是⼀个全局性的运算,这种算法在本质上是序贯的.如果图像中仅有⼀个物体,那么找连通成份就没有必要;如果图像中有许多物体,且需要求出物体的特性与位置,则必须确定连通成份.连通标记算法可以找到图像中的所有连通成份,并对同⼀连通成份中的所有点分配同⼀标记.图3.10表⽰的是⼀幅图像和已标记的连通成份.在很多应⽤中,要求在标记连通成份的同时算出连通成份的特征,如尺⼨、位置、⽅向和外接矩形.下⾯介绍两种连通成份标记算法:递归算法和序贯算法[Jain 1995].图3.10 ⼀副图像及其连通成分图像(1)递归算法递归算法在串⾏处理器上的计算效率是很低的,因此,这⼀算法主要⽤于并⾏机上.算法3.1连通成份递归算法1.扫描图像,找到没有标记的1点,给它分配⼀个新的标记L.3.递归分配标记L给1点的邻点.3.如果不存在没标记的点,则停⽌.4.返回第⼀步.(2)序贯算法序贯算法通常要求对图像进⾏⼆次处理.由于这⼀算法⼀次仅运算图像的两⾏,因此当图像以⽂件形式存贮且空间不允许把整幅图像载⼊内存时也能使⽤这⼀算法.这⼀算法(见算法3.2)可以查看某⼀点的邻点,并且可以给像素值为1的邻点分配⼀个已经使⽤过的标记.如果图像的邻点有两种不同的标记,则⽤⼀个等价表(equivalent table)来记录所有的等价标记.在第⼆次处理过程中,使⽤这⼀等价表来给某⼀连通成份中所有像素点分配唯⼀的标记.本算法在从左到右、从上到下扫描图像时,算法仅能查询到某⼀像素点的4-近邻中的两个近邻点,即上点与左点.设算法已经查到了该像素的这两个近邻点,此时出现三种情况:(1) 如果这两个近邻点中没有⼀点为1,则该像素点需要⼀个新的标记.(2) 如果这两个近邻点中只有⼀点为1,且分配了标记L,那么该像素点的标记也为L.(3) 如果这两个邻点都为1,且已分配了标记L,则该像素点的标记还是L;但是当近邻点被分配了不同标记M 与N,则这两个标记被⽤于了同⼀组元,应该把它们合并.在这种情况下,应把其中的⼀个标记(⼀般选⽤最⼩的那个标记)分配给该像素点,并在等价表中登记为等价标记.等价表包含了给每⼀连通成份分配唯⼀标记的信息.在第⼀次扫描中,所有属于同⼀连通成份的标记被视为是等价的.在第⼆次扫描中,从⼀个等价集(equivalent set)中选择⼀个标记并分配给连通成份中所有像素点.通常将最⼩的标记分配给⼀个连通成份.第⼆次扫描将给每⼀连通成份分配唯⼀的标记.在找到所有的连通成份后,应该统计等价表,以便删除其中的空格;然后将等价表作为查找表对图像重新进⾏扫描,以便重新统计图像中的标记.计算每⼀连通成份的⾯积、⼀阶矩、⼆阶矩是序贯连通成份算法的⼀个部分.当然,必须使⽤分离变量来累加每⼀区域的矩信息.当区域合并后,每⼀区域的矩累计值也应加到⼀起.算法3.24-连通序贯连通成份算法1.从左⾄右、从上到下扫描图像.2.如果像素点为1,则:(a) 如果上⾯点和左⾯点有⼀个标记,则复制这⼀标记.(b) 如果两点有相同的标记,复制这⼀标记.(c) 如果两点有不同的标记,则复制上点的标记且将两个标记输⼊等价表中作为等价标记.(d) 否则给这⼀个像素点分配⼀新的标记并将这⼀标记输⼊等价表.3.如果需考虑更多的点,则回到第⼆步.4.在等价表的每⼀等价集中找到最低的标记.5.扫描图像,⽤等价表中的最低标记取代每⼀标记.3.5.3 欧拉数在许多应⽤中,亏格数(genus)或欧拉数可作为识别物体的特征.亏格数定义为连通成份数减去空洞数,E-=(3.21)CH其中,E,C和H分别是欧拉数、连通成份数与空洞数.这个式⼦给出了⼀个简单的拓朴特征,这种拓扑特征具有平稳、旋转和⽐例不变特性.图3.11给出了⼀些例⼦及其对应的欧拉数.==EE2=E1-图3.11 字母“A”、“B”、“i”及它们的欧拉数.注意前景⽤了8-连通,⽽背景⽤了4-连通.3.5.4 区域边界连通成份S的边界是那些属于S且与?S邻接的点集.使⽤简单的局部运算就可找到边界点.在⼤多数应⽤中,我们都想⽤⼀特定的顺序跟踪边界点.⼀般的算法是按顺时针⽅向跟踪区域的所有点.此处讨论⼀个简单的边界跟踪算法.假定物体边界不在图像的边界上(即物体完全在图像内部),边界跟踪算法先选择⼀起始点S s ∈,然后跟踪边界直到回到起始点.这种算法概括在算法3.3中.这种算法对尺⼨⼤于1个象素的所有区域都是有效的.⽤这种算法求区域8-邻点的边界如图3.12(a)所⽰.为了得到平滑的图像边界,可以在检测和跟踪图像边界后,利⽤边界点的⽅向信息来平滑边界。
常用信源编码方法之游程编码
打印稿 译码器 打印
电话网
Page 10
二值图像 扫描后传真图像属于二值数据,在计
算机中是用像素来表示,我们把一副图像 细分成很多行,又把每行分为很多像素。 像素只有两种取值:0表示背景(白色), 1表示前景(黑色)。
Page 11
例:下图是一幅10×50黑白二值图像 “Hi Mom”
码”、“算术编码”等
Page 6
二、游程编码
简介 游程编码又称“游程长度编码”、“运
行长度编码”或“行程编码”,该编码属 于无失真压缩编码 。
主要应用在二值文件数据压缩:传真文 件、二值图像压缩、音频信号压缩等
Page 7
编码原理 原始数据有一定的相关性,往往连续出
现同样的消息,将同一个消息连续出现的 序列称为游程。该游程可以用一个消息的 样本和对于出现的次数来表示,译码时可 以根据样本和数量进行数据恢复。
T
<T
T
结尾码
Page 18
[例] 设某页传真文件中某一扫描行的像素点为: 17 (白) 5(黑) 55(白) 10(黑) 1641(白)
101011 0011 01011000 0000100 010011010+ 00101010 000000000001
1600+41
EOL
原一行为1728个像素,用“0”表示白,用“l”表示 黑,需1728位二元码元。MH码只需用54位二元码元, 数据压缩比为1728:54=32,压缩效率很高。
夫曼编码,大概率编短码,小概率编长码。 (3)白游程长度一般都比黑游程长度大,可
考虑分开编码。
Page 13
2、MH编码
MH编码又叫修正的霍夫曼编码,是ITU 向各国推荐使用的编码方案。先逐行游程 编码,再进行霍夫曼编码。该方案是根据 多个传真样本为概率统计依据而进行编码 的。
游程编码文档
游程编码翟文婕张亚群陈红古明春游程编码RCL:又称“游程长度编码”,“运行长度编码”,或“行程编码”,是一种统计编码,该编码啊属于无损编码(指使用压缩后的数据进行重构(或者叫做还原,解压缩),重构后的数据与原来的数据完全相同)。
对于二值图有效。
在游程编码中,游码长度RL,简称游程,指由字符串构成的数据流中各个字符重复出现而形成的字符长度。
一.其编码的基本原理(RCL原理)如下:用一个符号值或串长代替具有相同值的连续符号,使符号长度少于原始数据的长度。
数据进行编码时,沿一定方向排列的具有相同灰度值的像素可看成是连续符号,用字串代替这些连续符号,可大幅度减少数据量。
需要注意的是:游程编码是连续精确的编码,在传输过程中,如果其中一位符号发生错误,即可影响整个编码序列,使行程编码无法还原回原始数据。
二.游程编码算法一般游程编码有两种算法,一种是使用1的起始位置和1的游程长度,另一种是只使用游程长度,如果第一个编码值为0,则表示游程长度编码是从0像素的长度开始。
两种方法各有优缺点:前一种存储比第二种困难,因此编程也比较复杂。
而后一种需要知道第一个像素值,故压缩编码算法中需给出所读出的图的第一个像素值。
三.基本RLC方法分析:基本RLC方法就是在数据流中直接用(数据字符X、串的位置Sc、串的长度RL)3个字符来给出上述3种信息。
但是用Sc作为前缀的低效、原字符串中RL 的长度和出现频度不够显著。
导致不实用。
所以我们在实际使用过程中在二值图像和连续色调图像中可以省去Sc,这样使得改进的RCL在图像编码中得到了广泛的应用。
四.具体编码, 以二值图像的游程编码为例接下来就以二值图像的游程编码为例具体介绍一下游程编码算法二值图像指是指仅有黑(用“1”代表)、白(用“0”代表)两个亮度值的图像。
可借助各种图像通信方式传输,最经典的通信方式是传真。
在对他编码时要对不同的白长(白像素游程)和黑长(黑像素游程)按其出现概率的不同分别配以不同长度的码字。
游程编码(行程编码)
(1)DC系数编码
求出差分值DIFF,查书中P52表4.2即可得前缀码(用 标准的霍夫曼编码)。
(2)AC系数编码
①若ZZ(k)为待编码的非零AC系数,根据ZZ(k)的幅度范
围由P60表4.8查出尾码的位数B=SSSS,按以下可求得尾码:
若ZZ=5,B=3,得原码101 尾码=ZZ(k)的B位 原码,若ZZ(k)≥0
5个黑 9个白 据:75白 5黑 9白
18黑
1621白
EOL
码字 1101101000;0011;10100;0000001000;0100110100010111; 000000000001
(2)将码字数一下,答案就是57 bit。
(3)压缩前数据总比特:75+5+9+18+1621=1728 bit。 所以数据压缩比:1728:57=30.316:1
(2)
RL=64~1728, 用一个组合基 干码加一个补 充结尾码;
(3)
规定每行都从白 游程开始,若实 际扫描行由黑开 始,则需在行首 加零长度白游程; 每行结束要加行 同步码EOL。
75个白
二值图像的游程编码
例题:设有一页传真文件其中某一扫描线上的像素点如 图 所示。求
(1)该扫描行的MH编码; (2)编码后的比特总数; (3)本编码行的数据压缩比。
●EOL:规则(3)。同步码,查表可得为000000000001。即为答案。
连续色调图像的二维编码
引出前提 编码原理
AC编码表示形式
前面介绍了二值图像的一维MH编码,但对于多值或 连续色调图像,黑白游程已不适用,而基本RCL的3 元组也不能直接用。
JPEG标准的基本系统利用Z型扫描,将二维量化系 统矩阵转换成了一维数组ZZ(k),数组的第一个元 素ZZ(0)为直流系数DC(在4.2.3节截断霍夫曼编 码中已经讨论过);ZZ(1)~ZZ(63)元素为交流 系数(AC)。
游程编码(行程编码)
(4)原始图像块要用8*8*8=512位,压缩后为49位,压缩比为10.45:1。
游程编码总结
(1) 游程编码RCL是一种熵编码。
(2) RCL仍需与其他前缀码结合才有望达到更
好的效果。这种方法对于二值图最有效。
(3) RCL仍是变长码,有其固有的缺点,即需
要较大容量的缓冲和较低误码的优质信道。
谢
谢!
解:
(1)数据:75白 5黑 9白 18黑 1621白 EOL 码字 1101101000;0011;10100;0000001000;0100110100010111; 000000000001
(2)将码字数一下,答案就是57 bit。 (3)压缩前数据总比特:75+5+9+18+1621=1728 bit。 所以数据压缩比:1728:57=30.316:1
缺点
用Sc作为前缀的低效、原字符串中RL的长度 和出现频度不够显著。导致不实用。
解决方法
在二值图像和连续色调图像中可以省去Sc,这样 使得改进的RCL在图像编码中得到了广泛的应用。
二值图像的游程编码
二值图像 定 义
是指仅有黑(用“1”代表)、白(用“0”代表) 两个亮度值的图像。可借助各种图像通信方式 传输,最经典的通信方式是传真。
素ZZ(0)为直流系数DC(在4.2.3节截断霍夫曼编 码中已经讨论过);ZZ(1)~ZZ(63)元素为交流 系数(AC)。
AC编码表示形式
JPEG将其联合编码表示为“NNNNSSSS+尾码”, “NNNN”为当前非零值相对于前一个非零AC系数的 零游程计数,表示ZRL;这将“NNNN/SSSS”组合 为一个新的前缀码,用二维霍夫曼编码。即为AC系
行程码设计规范
行程码设计规范
行程编码又称游程编码行程长度编码变动长度编码等是一种统计编码,主要技术是检测重复的比特或字符序列并用它们的出现次数取而代之比较适合于二值图像的编码但是不适用于连续色调阁像的压缩。
该压缩编码技术相当直观和经济运算也相当简单因此解压缩速度很快,RLE 压缩编码尤其适用于计算机生成的图形图像对减少存储容量很有效果。
行程编码对传输差错很敏感如果其中一位符号发生错误就会影响整个编码序列的正确性,使行程编码无法还原回原始数据因此一般要用行同步列同步的方法.把差错控制在一行一列之内。
行程编码分为定长行程编码和变长行程编码两种定长行程编码是指编码的行程所使用的二进制位数固定,如果灰度连续相等的个数超过了固定二进制位数所能表示的最大值则进行下一轮行程编码。
游程编码的基本原理
游程编码的基本原理
游程编码,又称“运行长度编码”或“行程编码”,是一种统计编码,属于无损压缩编码。
其基本原理是用一个符号值和串长代替具有相同值的连续符号,使符号长度少于原始数据的长度。
只在各行或者各列数据的代码发生变化时,一次记录该代码及相同代码重复的个数,从而实现数据的压缩。
行程编码的位数远远少于原始字符串的位数。
游程编码是一种无损压缩编码,其应用场景包括但不限于:
旅行管理软件:许多旅行管理软件都使用行程编码来记录和管理旅行信息。
用户可以通过输入行程编码,快速查询和管理自己的行程。
旅行管理软件还可以根据行程编码,提供相关的推荐和服务,如附近的景点、美食等。
旅行社和导游服务:旅行社和导游服务可以使用行程编码来管理和分享旅行信息。
此外,游程编码也广泛应用于各种软件、声音、影像格式等领域。
在图像格式压缩领域,游程编码可以用于二值图的有效压缩。
游程编码原理
游程编码原理游程编码游程编码(Run-length encoding,简称RLE)是一种简单的无损压缩算法,常用于对连续的重复数据进行压缩。
它的原理非常简单,通过记录数据中连续出现的游程(Run)的长度和值来减少数据的存储空间。
游程编码原理游程编码利用了重复连续数据的特点,将连续出现的重复数据用“重复次数+数据值”的形式进行存储。
例如,对于一串重复的数据“AAAABBBCCDAA”,使用游程编码后可以表示为“4A3B2C1D2A”。
游程编码过程游程编码的过程分为两个步骤:压缩和解压缩。
压缩1.从数据的开头开始,记录当前字符的值和游程长度,初始游程长度为1。
2.比较当前字符和下一个字符。
如果相同,则游程长度加1,并继续比较下一个字符;如果不同,则将当前字符的值和游程长度保存起来,然后重新开始记录下一个字符的值和游程长度。
3.重复步骤2,直到遍历完整个数据。
解压缩1.从压缩后的数据的开头开始,解析每个游程。
2.如果游程的长度为1,则直接将对应的值存入解压缩后的数据。
3.如果游程的长度大于1,则需要根据游程的长度复制对应的值,并存入解压缩后的数据。
游程编码的优缺点优点1.简单易懂:游程编码的原理简单,实现起来比较容易。
2.适用于重复数据:对于连续出现的重复数据,游程编码可以大幅度减少存储空间。
缺点1.不适用于随机数据:对于没有连续重复的数据,游程编码几乎没有压缩效果,甚至可能导致压缩后的数据比原始数据更长。
2.压缩率有限:尽管游程编码可以有效压缩连续的重复数据,但对于其他类型的数据,压缩效果有限。
游程编码在实际应用中的例子游程编码广泛应用于各种数据存储和传输场景中,特别是在图像和音频压缩中。
在图像压缩领域,游程编码被用于压缩二值图像(如黑白图像),以及压缩彩色图像的各个通道。
通过游程编码对连续的像素值进行压缩,可以大幅度减小图像文件的大小。
在音频压缩领域,游程编码常被用于对连续的音频样本进行压缩,尤其是对于采样率较高的音频。
信息论 第4章(哈夫曼编码和游程编码)
游程编码的基本原理
很多信源产生的消息有一定相关性,往往 连续多次输出同样的消息,同一个消息连续输 出的个数称为游程(Run-Length).我们只需要 输出一个消息的样本和对应重复次数,就完全 可以恢复原来的消息系列.原始消息系列经过 这种方式编码后,就成为一个个编码单元(如下 图),其中标识码是一个能够和消息码区分的特 殊符号.
文件传真压缩方法具体流程
主要利用终止码和形成码(见书本P43-44), 一般A4的纸每行的像素为1728,具体编码规则 如下: (1)当游程长度小于64时,直接用一个对应 的终止码表示。 (2)当游程长度在64到1728之间时,用一个 形成码加一个终止码表示。 例如:白游程为662时用640形成码(白)加22终 止码(白)表示,即:01100111 0000011. 黑游程为256时用256形成码(黑)加0终止码(黑) 表示,即:000001011011 0000110111.
哈夫曼(Huffman) (3)哈夫曼(Huffman)编码
哈夫曼编码:将信源中的各个消息按概率排序, 不断将概率最小的两个消息进行合并,直到合 并为一个整体,然后根据合并的过程分配码字, 得到各个消息的编码。 该方法简单明了,并且可以保证最终的编 码方案一定是最优编码方案。
哈夫曼(Huffman) 哈夫曼(Huffman)编码的例子
香农编码的例子
游程编码实验报告
l=1;
for m=1:image4length
for n=1:1:image4(m);
rec_image(l)=data(m);
l=l+1;
end
end
u=1:1:length(rec_image); % 查看解压后的图像数据
figure,plot(u,rec_image(u));
3、游程编码算法
一般游程编码有两种算法,一种是使用1的起始位置和1的游程长度,另一种是只使用游程长度,如果第一个编码值为0,则表示游程长度编码是从0像素的长度开始。这次实验采用的是前一种算法。两种方法各有优缺点:前一种存储比第二种困难,因此编程也比较复杂。而后一种需要知道第一个像素值,故压缩编码算法中需给出所读出的图的第一个像素值。
三、仿真方案详细设计
实验过程分为四步:分别是读入一副图象,将它转换成为二进制灰度图像,然后对其进行游程编码和压缩,最后恢复图象(只能恢复为二值图像)。
1、二值转换
所谓二值图像,就是指图像上的所有像素点的灰度值只用两种可能,不为“0”就为“1”,也就是整个图像呈现出明显的黑白效果。
2、游程编码原理
游程编码是一种无损压缩编码,对于二值图有效。游程编码的基本原理是:用一个符号值或串长代替具有相同值的连续符号,使符号长度少于原始数据的长度。据进行编码时,沿一定方向排列的具有相同灰度值的像素可看成是连续符号,用字串代替这些连续符号,可大幅度减少数据量。游程编码分为定长行程编码和不定长行程编码两种类型。游程编码是连续精确的编码,在传输过程中,如果其中一位符号发生错误,即可影响整个编码序列,使行程编码无法还原回原始数据。
image4length=length(image4); % 统计游程编码后的所占字节长度
一种基于分块的二值图像信息隐藏算法
Abstra c t: A new data hiding algorithm for bina ry im ages based on im age pa rtition is p roposed. The flip2 pability of each pixel is computed through a rule. Shuffling is applied in orde r to average the spa tial dis2 tribution of p ixe ls that are suitable for flipp ing. The shuffled im age is then divided into blocks and feature value extracted from each block is organized into a binary m atrix . The binarym atrix is again divided into blocks, according to which the secret m essage is embedded. W henever som e feature value needs to be modified, the algorithm can find the most suitable pixel in the corresponding im age block and flip it . The expe rim ents p rove tha t the algorithm can em bed moderate am ount of sec re t me ssage, the percep tual trans2 parence is good, and the security is satisfac tory as well . Key wor ds: bina ry im age; data hiding; fea ture m atrix; flippability, shuffling 信息隐藏技术 [ 1 ] 是将敏感信息嵌入到普通的公开信息中 (如数字相片 、 广告图片 、 古典音乐等 ) 进行 传输 ,隐蔽了敏感信息的存在 ,从而不易引起攻击者的注意 , 保证了信息安全 . 信息隐藏技术已经是信息领 域研究的热点 , 并逐渐受到人们的普遍重视 . 目前提出的很多信息隐藏算法都是基于彩色图像和灰度图像 ,因为这两类图像的颜色信息较为丰富 , 对其进行细微的修改不会引起明显的视觉异常 , 所以冗余空间较大 , 进行信息隐藏较易实现 . 而二值图像 因仅有黑白两种颜色 ,色调单一 ,对像素的修改比较敏感 , 因此在二值图像中进行信息隐藏相对困难得多 . 目前的很多隐藏算法 (如最低有效位算法 、 修改 DCT系数等 ) 都是针对灰度图像的 , 不能直接运用到二值 图像上 . 现有的适用于二值图像的信息隐藏方法有分块嵌入法 、 游程修改法、 文字特征修改法 、 结构微调法 等 [ 2 ] . 游程修改法的视觉影响受游程长短的影响 , 在短游程较多时图像视觉质量较差 . 文字特征修改法只 适合文字笔画丰富的图像 ,嵌入信息的容量较小 . 相比之下 , 分块法由于操作简单 , 信息嵌入容量较大 , 是 当前的二值图像主流算法 . W u 等提出了一种基于分块的二值图像信息隐藏算法 [ 3 ] ,该算法首先计算出全图所有像素的“ 可修改 度” , 然后将原始图像进行置乱 ,再将置乱后的图像分块 . 修改块内“ 可修改度 ” 最大的像素 , 使块内像素值 之和的奇偶性与嵌入的数据位相一致 , 从而完成信息的嵌入 . 提取端则将图像分块 , 逐块求和对 2取模即
计算机的数据与编码
计算机的数据与编码随着科技的飞速发展,计算机已经成为我们生活中不可或缺的一部分。
无论是在工作、学习还是娱乐中,计算机都扮演着重要的角色。
然而,计算机与人之间的交流并不是直观的,而是通过一种特殊的方式来实现,即数据与编码。
让我们来看看什么是计算机数据。
在计算机科学中,数据是用来表示事物或现象的一种符号记录。
它可以是数字、文字、图像、音频或视频等。
例如,当我们输入“Hello World”到计算机中时,计算机将把我们输入的字符存储为二进制数据,每个字符都被转换为一串二进制代码。
接下来,让我们来看看什么是编码。
编码是将信息转换为计算机可识别的形式的过程。
编码可以是二进制编码、ASCII编码、Unicode编码等。
例如,当我们输入的“Hello World”被转换为二进制数据后,计算机将根据某种编码规则将其解析为字符并显示出来。
在计算机中,数据和编码是密不可分的。
它们之间的关系可以概括为以下几点:1、数据是编码的对象:编码是将数据转换为计算机可识别的形式的过程,因此数据是编码的对象。
2、编码是数据处理的基础:在计算机中,数据处理包括数据的存储、传输、显示等。
编码是实现这些操作的基础,因为只有通过编码,计算机才能正确地识别和处理数据。
3、数据和编码的相互转换:在计算机中,数据和编码之间需要进行相互转换。
例如,当我们将数据输入到计算机中时,我们需要将其转换为二进制代码进行存储;当我们将数据输出到计算机屏幕上时,我们需要将其从二进制代码转换为字符进行显示。
计算机的数据与编码是密不可分的。
它们之间的关系是计算机处理信息的基础。
只有了解数据与编码的关系和转换方式,我们才能更好地理解和应用计算机科学中的其他概念和技术。
在当今数字化的世界中,计算机已成为我们生活、学习和工作中不可或缺的工具。
而在计算机科学中,信息编码是实现信息存储、传输和处理的关键技术。
本文将探讨计算机中的信息编码,帮助读者更好地理解这一重要概念。
信息编码是指将信息转换为计算机能够处理的格式的过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[row col]=size(oi);
oi=oi(:
);
len=size(oi);
i=1;
j=1;
while(i<len
(1))
or=oi(i);
count=1;
while(i<len
(1)&&oi(i+1)==or)
i=i+1;
count=count+1;
end
RLE(j)=count;
j=j+1;
A=oi;
fori=1:length(oi)
if(oi(i)<128)
A(i)=0;
else
A(i)=1;
end
end
4.提取算法源代码RLEextract.m文件
clc;
clear all;
oi=imread('marked.bmp');
if(length(size(oi))==3)
oi=rgb2gray(oi);
for l=1:msgcount
modpoint=0;
for x=1:2*l
modpoint=modpoint+RLE(x,2);
end
ifmsg(l)==0
if ((mod(RLE(2*l,2),2)~=0)&&(RLE(2*l+1,2)~=1))
oi(modpoint+1)=mod(oi(modpoint+1)+1,2);
%RLE(l+1,2)=RLE(l+1,2)-1;
%end
%else
%if((mod(RLE(l,2),2)==0)&&(RLE(l+1,2)~=1))
%oi(RLE(l+1,1))=mod(oi(RLE(l+1,1))+1,2);
%RLE(l+1,2)=RLE(l+1,2)-1;
%end
%end
% end
count=count+1;
end
RLE(j,:
)=[t,count];%RLE为游程
j=j+1;
i=i+1;
t=t+count;
end
ifi==len
(1)
RLE(j,:
)=[i,1];
end
% RLE=RLE';
msgfid=fopen('hidden.txt','r');
[msg,msgcount]=fread(msgfid);
fclose(msgfid);
msg=uint8(dec2bin(msg)-48);
[htxt,ltxt]=size(msg);
mmsg=zeros(htxt,8);
if(ltxt<8)
n=8-ltxt;
mm=zeros(htxt,n);
fori=1:htxt
mmsg(i,:
)=[mm(i,:
),msg(i,:
注:
本代码来源于《信息隐藏于数字水印实验教程》,但是源程序在Matlab2012版本上面无法正确运行,因此本人进行简单的修改后可以顺利运行,但是提取的数据还是不对。。。
1.隐藏算法源代码RLEhiding.m文件
clc;
clear all
oi=imread('lena.bmp');
if(length(size(oi))==3)
)];
end
end
msg=mmsg';
msgcount=msgcount*8;
% for l=1:msgcount
%if msg(l)==0
%if((mod(RLE(l,2),2)~=0)&&(RLE(l+1,2)~=1))
%oi(RLE(l+1,1))=mod(oi(RLE(l+1,1))+1,2);
len=size(ot);
A=zeros(len
(1),1);
fori=1:len
(1)
sum=0;
for j=7:(-1):0
sum=sum+ot(i,8-j)*2^j;
end
A(i)=sum;
End
i=i+1;
end
ifi==len
(1)
RLE(j)=1;
end
RLE=RLE';
msgcount=72;%必须知道水印的长度
msg=zeros(msgcount,1);
n=0;
for l=1:msgcount
if mod(RLE(2*l),2)==0
msg(l)=0;
else
msg(l)=1;
end
பைடு நூலகம்end
else
if ((mod(RLE(2*l,2),2)==0)&&(RLE(2*l+1,2)~=1))
oi(modpoint+1)=mod(oi(modpoint+1)+1,2);
end
end
end
m1=Vector2Matrix(oi,row);
m1=m1';
imwrite(m1,'marked.bmp');
oi=rgb2gray(oi);
end
[row col]=size(oi);
oi=oi(:
);
oi=ToBin(oi);
len=size(oi);
i=1;
j=1;
t=1;
whilei<len
(1)
or=oi(i);
count=1;
while (i<len
(1)&&oi(i+1)==or)
i=i+1;
%将数组转换成二位数组,row为行数
cl=length(oi)/row;
A=zeros(row,cl);
fori=1:row
for j=1:cl
A(i,j)=oi(cl*(i-1)+j);
end
end
3.ToBin.m子函数
function A=ToBin(oi)
%将像素点的值转换为0和1,oi为一维二值图像数组
figure;
subplot(1,2,1);imshow('lena.bmp');title('original image');
subplot(1,2,2);imshow('marked.bmp');title('watermarked image');
2.Vector2Matrix.m子函数
function A=Vector2Matrix(oi,row)
end
ot=Vector2Matrix(msg,msgcount/8);
out=bit2str(ot);
fid=fopen('message.txt','wt');
fwrite(fid,out);
fclose(fid);
5.bit2str.m子函数
function A=bit2str(ot)
%二进制转换为十进制,ot为二进制一维向量