2013 B 碎纸片拼接复原问题

破碎文件的拼接在司法物证复原、历史文献修复以及军事情报获取等领域都有着重要的应用。传统上,拼接复原工作需由人工完成,准确率较高,但效率很低。特别是当碎片数量巨大,人工拼接很难在短时间内完成任务。随着计算机技术的发展,人们试图开发碎纸片的自动拼接技术,以提高拼接复原效率。请讨论以下问题:

1. 对于给定的来自同一页印刷文字文件的碎纸机破碎纸片(仅纵切),建立碎纸片拼接复原模型和算法,并针对附件1、附件2给出的中、英文各一页文件的碎片数据进行拼接复原。如果复原过程需要人工干预,请写出干预方式及干预的时间节点。复原结果以图片形式及表格形式表达(见【结果表达格式说明】)。

2. 对于碎纸机既纵切又横切的情形,请设计碎纸片拼接复原模型和算法,并针对附件3、附件4给出的中、英文各一页文件的碎片数据进行拼接复原。如果复原过程需要人工干预,请写出干预方式及干预的时间节点。复原结果表达要求同上。

3. 上述所给碎片数据均为单面打印文件,从现实情形出发,还可能有双面打印文件的碎纸片拼接复原问题需要解决。附件5给出的是一页英文印刷文字双面打印文件的碎片数据。请尝试设计相应的碎纸片拼接复原模型与算法,并就附件5的碎片数据给出拼接复原结果,结果表达要求同上。

【数据文件说明】

每一附件为同一页纸的碎片数据。
附件1、附件2为纵切碎片数据,每页纸被切为19条碎片。
附件3、附件4为纵横切碎片数据,每页纸被切为11×19个碎片。
附件5为纵横切碎片数据,每页纸被切为11×19个碎片,每个碎片有正反两面。该附件中每一碎片对应两个文件,共有2×11×19个文件,例如,第一个碎片的两面分别对应文件000a、000b。

解决

基于旅行商规划模型的碎纸片拼接复原问题研究
摘要
本文分别针对 RSSTD(Reconstruction of Strip Shredded Text Document)、
RCCSTD(Reconstruction of cross-cut Shredded Text Document)和 Two-Sides
RCCSTD 三种类型的碎纸片拼接复原问题进行了建模与求解算法设计。首先我们对于 RSSTD 问题,建立了基于二值匹配度的 TSP 模型,并将其转化为线性规划模型,利用贪心策略复原了该问题的中文和英文碎片;然后对于 RCCSTD 问题,由于中英文字的差别,我们分别建立了基于改进误差评估的汉字拼接模型和基于文字基线的误差评估的英文字拼接模型,并利用误差评估匹配算法,复原了该问题的中文和英文碎片;随后我们针对正反两面的 RCCSTD 问题,利用基线的概念将正反两面分行,转化为 RCCSTD 问题,并复原了该问题的英文碎片。最后,我们对模型的算法和结果进行了检验和分析。
◎问题一:我们针对仅纵切的情况,首先将图像进行数字化处理,转换为了二值图像,然后得到各图像的边缘,并计算所有碎片与其他碎片边缘的匹配程度。
然后,根据两两碎片之间的匹配程度建立了 TSP 模型,并将其划归为线性规划模型。最终,我们根据左边距的信息确定了左边第一碎片,随后设计了基于匹配度的贪心算法从左向右得到了所有碎片的拼接复原结果。结果表明我们的方法对于中英文两种情况适用性均较好,且该过程不需要人工干预。
◎问题二:我们针对既纵切又横切的情况,由于中英文的差异性,我们在进行分行聚类时应采用不同的标准。首先根据左右边距的信息确定了左边和右边的碎片,随后分别利用基于改进误差评估的汉字拼接模型和基于文字基线的误差评估模型,将剩余的碎片进行分行聚类,然后再利用基于误差评估的行内匹配算法对行内进行了拼接,最终利用行间匹配算法对行间的碎片进行了再拼接,最终得到了拼接复原结果。对于拼接过程中可能出现误判的情况,我们利用 GUI 编写了人机交互的人工干预界面,用人的直觉判断提高匹配的成功率和完整性。
◎问题三:我们针对正反两面的情况,首先根据正反基线信息,分别确定了左右两边的碎片,然后利用基线差值将其两两聚类,聚类以后其正反方向也一并确定,随后我们将其与剩余碎片进行分行聚类,最终又利用行内匹配和行间匹配算法得到了最终拼接复原结果。其中,对于可能出现的误判情况,我们同样在匹配算法中使用了基于 GUI 的人机交互干预方式,利用人的直觉提高了结果的可靠性和完整性。
关键字:碎片复原、TSP、误差评估匹配、基线误差、人工干预
一、问题重述
破碎文件的拼接复原工作在传统上主要需由人工完成,准确率较高,但效率很低。特别是当碎片数量巨大,人工拼接很难在短时间内完成任务。随着计算机技术的发展,人们试图开发碎纸片的自动拼接技术,以提高拼接复原效率。请讨论以下问题:

  1. 对于给定的来自同一页印刷文字文件的碎纸机破碎纸片(仅纵切),建立碎纸片拼接复原模型和算法,并针对附件 1、附件 2 给出的中、英文各一页文件的碎片数据进行拼接复原。如果复原过程需要人工干预,请写出干预方式及干预的时间节点。复原结果以图片形式及表格形式表达。
  2. 对于碎纸机既纵切又横切的情形,请设计碎纸片拼接复原模型和算法,并针对附件 3、附件 4 给出的中、英文各一页文件的碎片数据进行拼接复原。如果复原过程需要人工干预,请写出干预方式及干预的时间节点。
  3. 上述所给碎片数据均为单面打印文件,从现实情形出发,还可能有双面打印文件的碎纸片拼接复原问题需要解决。请尝试设计相应的碎纸片拼接复原模型与算法,并就附件 5 的碎片数据给出拼接复原结果。
    二、问题分析
    破碎文件的拼接复原工作,传统人工处理准确率高,但是效率低。随着计算机技术的发展,本问题试图寻找碎纸片的自动拼接方法。本文的碎片均为矩形,且大小一样,这就给碎片的拼接带来了困难,因为难以利用碎片的轮廓信息,从而只能利用碎片边缘的图像像素信息来进行拼接。
    对于问题一,给出了纵切的 19 条碎纸片,碎片为 198072,总切线的像素点较多,并且碎纸片的数量较少,从效率出发,可以直接考虑纵切条上的像素统计信息。为了衡量匹配程度,需要建立误差评估函数。本文考虑采用 TSP 模型,将碎纸片作为节点,将误差评估函数的值作为节点之间的权值,寻找最优解。在本问题的情况下,中英文的差别并无太大影响。
    对于问题二,由于给出的数据是横纵切的中英文碎片,碎片大小为 180
    72,各 208 张。因为碎纸片的数量较多,直接匹配则为 NP 问题中的无法用多项式解决的问题,所以先将行分组匹配完成后再把各行拼接起来。本问题主要解决:1)如何正确高效分组;2)如何准确高效拼接。考虑到中文和英文在字形和印刷结构上的不同,需要定义不同的特征向量去描述中文和英文的碎纸片上的信息。文字各行的位置和间距将作为重要的分组依据。在问题一的基础上,由于每个碎纸片的边缘像素较少,为了充分利用包含信息,误差评估函数的定义将会比问题一中更加细化。行之间的拼接将会利用边缘像素和间距匹配。在本问题中,中英文的基线选择方法将会有很大不同。
    对于问题三,在问题二的基础上,加入了正反面信息,碎纸片的形状并没有改变。因此,需要在问题二的误差评估函数的基础上,综合考虑正反面的匹配误差。分组的方法与行间的拼接方式与问题二基本相同。
    综上所述,本问题可以看做是 TSP 问题,碎纸片为节点,误差评估函数值为边的权值,寻求最优解的问题。
    三、模型假设
  4. 假设需要复原的碎片是来自同一张纸,且对于该张纸具有完备性。
  5. 假设同一页中,文字的种类、行间距和段落分布情况是相同的。
    四、符号说明
    mijk 碎片i 和碎片 j 第k行之间的匹配度
    Mij 碎片i 和碎片 j 之间的匹配度
    dtb 由上边缘向下像素点由黑过度到白的距离
    dbb 由下边缘向上像素点由黑过度到白的距离
    dtw 由上边缘向下像素点由白过度到黑的距离
    dbw 由下边缘向上像素点由白过度到黑的距离
    c i jh ( , ) 碎片i 和碎片 j 之间左右边缘误差评估值
    c i jh( , ) 碎片i 和碎片 j 之间左右边缘相对误差评估值
    cw(p q, ) 行片段之间上下边缘的误差评估值

五、模型建立与求解
文件碎片拼接主要有两类不同的技术标准:
(1) Reconstruction of Strip Shredded Text Documents(RSSTD)
碎片的长度和原始文件的长度相等,同时所有碎纸片都是等宽的长方形。
(2) Reconstruction of Cross-cut Shredded Text Document(RCCSTD)
所有的文件碎片都是长方形且大小相等,但其长度小于原始文件的长度。
问题一为典型的 RSSTD 问题,我们通过分析碎纸片文字的行特征,建立了一种基于匹配度的求解模型,下面就对该模型的建立进行详细的讨论。
5.1 问题 1——基于匹配度的 RSSTD 问题研究
为了便于对图像数据进行分析,我们首先需要对其进行数字化处理以及文字行特征的提取,而后再建立基于匹配度的模型。
5.1.1 图像数字化处理
图像的数字化处理主要包括以下几个方面:
(1) 二值化处理
由于纵切碎纸片的长度特征(碎片长度与原始文件长度相等),其边缘像素点信息量丰富。因此我们采取二值化而非灰度对图像进行了处理,进一步简化了算法的复杂度,得到每条碎片像素大小为 721980(长宽),像素点值取{0,1},其中 0 和 1 分别表示颜色的黑与白。
(2) edge 矩阵的建立
edge[i,j]为 192 的矩阵,储存每一条碎片的边缘像素点信息。其中 i 表示碎片的编号,j=0 表示左侧边缘像素点信息,j=1 表示右侧边缘像素点信息。例如, edge[0,0]储存 001 号碎片左侧边缘像素点信息。
(3) count 矩阵的建立
根据 edge[i,j]矩阵,我们可以计算得到一个 192 的 count[i,j]矩阵,该矩阵储存每一条碎片边缘取值为 0 的像素点的数量。例如,count[0,0]=350 表示 001 号碎片左侧边缘共有 350 个黑色像素点。
(4) shred with blank left 的选取
根据 count 矩阵,若 edge[i,0]=0,那么我们就认为该碎片在原始文件中处于最左端,即为选取的 shred with blank left。
(5) 碎片行特征的提取
由于原始文件文字行特征明显,因此我们需要提取碎片的行特征(其具体的原因见匹配度的定义)。首先确定碎片顶端取值为 0 的像素点的位置,以此作水平线为上边界,依次向下取 w 为行宽(这里取 w=40 pixels 以保证能容纳每一个文字)直至下边缘,得到每条碎片的行数为{n1, n2,…, n19};然后取n=max{n1, n2,…, n19}作为最终确定的行数,并以该条碎片的行化方式为标准对每一条碎片进行行化;最终每一条碎片被划分为 28 行。
每条碎片维护着以下的特征数据表:
表 1 碎片 i 特征数据表
k 1 2 3 „ 27 28
nkl ni1l ni2l ni3l „ ni27l ni28l
nkr ni1r ni2r ni3r „ ni27r ni28r
其中,k 为行号;nkl 为第 k 行左侧边缘取值为 0 的像素点的数量,nkr 为第 k 行右侧边缘取值为 0 的像素点的数量;nikl 为第 i 条碎片第 k 行左侧边缘取值为 0 的像素点的数量。
5.1.2 匹配度的定义
为了衡量两个碎片之间的匹配程度,我们定义匹配度 Mij 作为评价的标准,其计算公式如下:
min(nikr ,njkl ) mijk  max(nikr ,njkl )
n
Mij  mijk k1
其中,n为总的行数(如n28);mijk 表示碎片i 和碎片 j 第k行之间的匹配度;Mij 表示碎片i 和碎片 j 之间的匹配度。
这里我们不选择通过统计碎片边缘总黑色像素点的数量来计算两碎片之间的匹配度,而是通过计算两碎片行匹配度来间接计算其匹配度,原因在于:
① 若以总的边缘黑色像素点计算匹配度,行与行之间的差异性无法体现,匹配结果误差过大;
② 通过行匹配度计算碎片之间的匹配程度,更加充分的挖掘了碎片边缘的信息,更为精确。
5.1.3 基于 TSP 问题的模型建立与求解
5.1.3.1 模型的建立
根据匹配度的定义,我们可以计算得到 19 个碎片两两之间边缘的匹配度,现可将问题化简为:已知起始碎片和其他碎片之间的匹配度,寻找一序列使得碎片之间总的匹配度达到最大。如右图所示:
(1) 为简化问题,我们引入空白碎片 0,同样可计算得到空白碎片与其他碎片的匹配度;
(2) 其中节点表示碎片,有向线段长度表示费用 wij,且 wij=1-Mij,箭头所指方向表示前一条碎片右侧边缘到后一条碎片左侧边缘。如①→②表示 1 号的碎片右侧边缘与 2 号碎片左侧边缘的费用;
(3) 现要求寻找一条回路遍历所有的节点使得费用达到最小。
通过分析,可以发现这是一典型的 TSP 问题。为解决上述问题,我们建立模型如下:
假设图中存在 Hamilton 回路,有 n 个节点,图中(i,j)边的权重为 wij,设决策变量为 xij=1 说明弧(i,j)进入到 Hamilton 回路中,则线性规划模型可表达[6]为:
min  w xij ij
(i j, )E
  xij 1
(i j, )E

  xji 1
( j i, )E
xij {0,1},( ,i j)E
Only One Circle
求解该问题就是求解该线性规划问题的最优解。
5.1.3.2 模型的求解
为了进一步求解上述模型,我们设计的算法如右图所示:
(1) 将所有碎片放入地址池中;
(2) 选出左侧全为白色像素点的碎片作为基准碎片,记为si,并将其从碎片池中剔除;(3)依次计算 si 右侧边缘与地址池中其他碎片 sj 左侧边缘的匹配度 Mij;
(4) 选择匹配度最大的碎片 st 作为碎片 si 的右侧碎片,并将其记为 si,从碎片池中剔除该碎片;
(5) 重复(3)~(4)步直至碎片池为空。
由于该算法使用统计量构建匹配度,很好的避免了中英文之间的差异性,适用性较好,在实际的应用中都收到了很好的效果。最终可以得到附件 1 与附件 2 中碎片的正确序列如下所示:

通过求解结果发现,我们利用贪心策略求解得到了全局最优解,原因在于匹配度的定义较好。同时由于碎片两侧提供的信息量大,很好的避免了中英文之间的差异性。若碎片规格变小,信息量减少,中英文之间差异性的讨论显得十分有必要。
5.2 问题 2——基于误差评估的 RCCSTD 问题研究
由于中英文的字存在显著的差异性,对算法的设计有很大影响,因此我们需要对它们进行具体的讨论。
如右图所示,我们可以分析得到如下的差异性特征:
(1) 中英文的字行存在显著的差异性,中文字结构复杂,笔画繁多,无法确定固定的基准线;
(2) 英文字印刷格式固定,一般为“四线三格”
的形式,容易通过基准线来确定具体字母的位置信息。
基于以上分析,我们需要针对中英文设计不同的模型进行碎纸片的拼接复原。
下面首先建立文字的拼接复原模型。
5.2.1 基于误差评估的汉字拼接模型
5.2.1.1 碎片的逐行分组
(1)逐行分组原因分析
首先参考问题一中的算法提取位于原始文件左右边界位置的 22 块碎片,以此为基础将所有碎片分为 22 组,而非按列分组或分为 11 组,主要原因如下:
①若按列分组,由于碎片上下边缘信息量少,分组误差较大,不可取;
②若以原始文件左侧边缘的 11 块碎片为基础将所有碎片分为 11 组,可能存在以下的问题:如右图所示,014 块碎片为原始文件的左侧边缘碎片,128 块碎片为其右侧碎片。但由于 014 块碎片处于一自然段的开始位置,上半部分基本为空白,而 128 块碎片上半部分信息丰富,两者匹配失败率高,很可能导致该组元素个数为 0。因此我们将碎片分为 22
组,同时考虑左侧边缘与右侧边缘的信息,分组效率高且准确率高。
(2)分组标准的确定
我们确立四个参数 dtb,dbb,dtw,dbw 其意义如右图所示。其中 dtb,dbb 代表由上下边缘至中间像素点由黑过度到白的距离;dtw,dbw 代表上下边缘至中间像素点由白过度到黑的距离。
根据上述定义,对于每一幅图像,首先判断其上下边缘的过度情况,由此可以确定上下边缘的两个参数。那么我们认为若两个碎片具有相同的参数,如同样为 dtb 和 dbw,同时相同参数之间的差值不超过 4pixels,即:
| dtb dtb | 4pixels 且 | dbw dbw | 4pixels
那么,我们认为两碎片在同一组内。最终可以得到分组情况如下表所示:
表 4 分组情况表
组号 组内成员编号 组号 组内成员编号
1 {7,68,175,0,126,174,56,53,208,158,
138,137,45} 12 {18,195}
2 {14} 13 {36}
3 {29} 14 {43}
4 {38,189,88,103,35,24,148,167,161,
46,122,130,193} 15 {59,37,98,104,10,75,48,171,
207,92,111,55,180,5,172, 64,44,201}
5 {49,54,28,192,22,129,190,186,118,
143,65,57,2,91} 16 {60,205,85,152}
6 {61,116,67,162,79,99,63,20,72,6, 17 {74,8,25,9}
69,96,131,78,163,52,19,177}
7 {71} 18 {123,152,194,207,154,119,
146,108,185,4,155,40,102, 101,140,113}
8 {89} 19 {141,188,12}
9 {94,42,144,97,34,77,127,90,84,121,
136,47,149,164,183,112,124} 20 {145,181,204,182,16,110,66,
184,13,106,109,150,139,187, 197,157,21,173}
10 {125} 21 {176,115,12,3,134,135,82,
39,169,31,203,199,51,159, 128,107,73,160}
11 {168,142,147,76,50,23,120,87,179,
62,100,191,41,26} 22 {196,32,93,153,70,166}
由上表可知,由于某些碎片的特殊性,仍不能归入任何一组。这些碎片有 1,
15,17,27,30,33,58,80,81,83,86,95,105,114,117,132,133, 156,165,170,178,198,200,202。我们可以将他们放入碎片池中,这一部分碎片后续将进行单独的处理。
5.2.1.2 组内碎片匹配算法的设计
评价两块碎片拼接的好坏程度,我们用误差评估函数来描述。
由题可知,每页被分为了 1119 个碎片,每个碎片具有同样的规格。那么,
就有hi  hj ,表示两碎片的高度相等。我们定义误差评估函数c i jh ( , )为:
h2
c i jh( , ) e i j yh( , , )
y3
e i j yh ( , , )  1 if e i j y h( , , )  0 otherwise
e i j yh( , , ) |0.7 (  v i yr ( , ) vl ( j y, ))
 0.1 ( v i yr ( , 1)vl ( j y, 1))
 0.1 ( v i yr ( , 1)vl ( j y, 1))
 0.05 ( v i yr ( ,  2)vl ( j y,  2))
+0.05 ( v i yr ( , 2)vl ( j y, 2))|
其中,每个像素点以 8 位数值表示,有:
v j yl ( , ),v i yr ( , ){0,…,255} with 1 y  h for the left and right edge
如上图所示,我们将一碎片边缘等分为三分。在考虑像素点 y 时,对其邻域 y+1,y+2,y-1,y-2 共 5 个像素点进行分析,并赋予不同的权重,那么可以分别计算得到三段的误差评估函数为ch1(i j c, ), h2 (i j c, ), h3 (i j, ) 。参考问题一,设计组内匹配算法如下:
(1) 将组内碎片以及剩余未分组的碎片放入碎片池中;
(2) 以左侧全为白色像素点的碎片为基准碎片,记为 si,并将其从碎片池中剔除;
(3) 依次计算 si 右侧边缘与地址池中其他碎片 sj 左侧边缘的误差评估值 ch1(i j c, ), h2 (i j c, ), h3 (i j, ) ;
(4) 依次计算碎片 si 与池中其他碎片 sj 的相对误差:[1]
3 |chk (i j, )minchk (i j, )| c i jh( , )  k1 chk (i j, )
其中,j 表示当前比较的碎片,j 为碎片池中其他的碎片,k表示上下三段,如h h h1, 2, 3;
(5) 选取相对偏差最小的碎片,且c i jh( , ) 时,将该碎片作为碎片 si 的右侧碎片,并记该碎片为 si,将其从碎片池中删除;
(6) 重复(3)~(5)步 18 次直至结束。
12~22 组可以根据同样的算法进行碎片的拼接复原。在此过程中由于最小相对误差的碎片存在多个,计算机很难进行取舍。因此,在程序中,我们设计了人机交互的界面,当遇到此类情况时,通过人工干预的方式来选择最佳的碎片。最后,可以得到 22 个拼接好的片段。
5.2.1.3 组间片段的匹配
组间片段的匹配,我们主要依据以下两点原则:
(1) 若两个片段在同一行,那么两个片段内碎片的数量应当互补(和为 19);
(2) 以一个片段为基础,计算其与右侧片段的相对偏差,相对偏差越小,匹配程度越高。
根据以上原则,最终可以得到左右两侧片段按行匹配的结果如下图所示:
表 5 22 组片段按行匹配情况表

左侧片段组号 1 2 3 4 5 6 7 8 9 10 11 右侧片段组号 22 21 15 74 19 13 16 18 14 20 12

注:这里行号不表示该行在原始文件中的顺序。
5.2.1.4 行间匹配
类似于组内碎片匹配的算法,通过计算行片段之间上下边缘的误差评估值 cw(p q, ),最终可以得到行片段的正确序列。行误差评估值[2]的计算公式如下:
w2
cw(p q, )  ew(p q x, , )
x3
其中,p q, 表示行片段号,w表示行像素点的数量。
根据上述模型及算法,最终可得到 1119 个碎片在原始文件中的序列如下
表所示:
表 6 附件 3 排序后碎片序列表
1
2 61 19 78 67 69 99 162 96 131 79 63 116 163 72 6 177 20 52 36
3 168 100 76 62 142 30 41 23 147 191 50 179 120 86 195 26 1 87 18
4 38 148 46 161 24 35 81 189 122 103 130 193 88 167 25 8 9 105 74
5 71 156 83 132 200 17 80 33 202 198 15 133 170 205 85 152 165 27 60
6 14 128 3 159 82 199 135 12 73 160 203 169 134 39 31 51 107 115 176
7 94 34 84 183 90 47 121 42 124 144 77 112 149 97 136 164 127 58 43
8 125 13 182 109 197 16 184 110 187 66 106 150 21 173 157 181 204 139 145
9 29 64 111 201 5 92 180 48 37 75 55 44 206 10 104 98 172 171 59
10 7 208 138 158 126 68 175 45 174 0 137 53 56 93 153 70 166 32 196 11 89 146 102 154 114 40 151 207 155 140 185 108 117 4 101 113 194 119 123

5.2.2 基于基线的英文字拼接模型
由上文的分析可以知道,英文与中文在字形、行分布等方面存在着很大的不同。在英文的印刷排版中对应字体均有比较严格的基准线,基线是排成一行的西文字符主体上的一条不可见的假想线。对于英文段落上完整的一行,一定存在至少四条基准线,将整行英文分布在三个格子中,即英文的“四线三格”。本问题中给出的是衬线体(serif 字体)示意图如下:

图 7 “三线四格”示意图
根据上述特征,我们建立了基于基线的碎片拼接模型。同中文字体,我们首
先需要对 1119 个碎片进行。
5.2.2.1 按行分组按行分组的重要依据是每一块碎片的基准线,因此首先需要确定每一个碎片基准线的具体位置。通过观察发现,基准线是黑白像素点的分水岭,因此通过统计黑白渐变处黑色像素点的数量,可以确定基准线的位置。
具体方法如下所示:
如右图所示,由上到下,由左到右按列统计从白色像素点到第一个黑色像素点的距离 lx,那么可以得到 72 个 lx 的数据,取众数即为第一条基准线的位置 line1,同样,从下到上统计 2 得到第二条基准线 line2。这样,每个碎片可得到至少 2 条基准线以及他们的位置信息。
同样,按行分组时:
(1) 选取左侧留白的碎片作为标准碎片,以基准线为依据,若碎片 i 和碎片 j 满足:| line1i line1j | 2pixels。那么,我们认为这两个碎片处于同一行。
(2) 若该碎片的基准线不和任何一行的标准碎片相吻合,那么将该碎片放入碎片池中。
最终可以得到 11 个组以及碎片池中少量的碎片。
5.2.2.2 组内匹配算法设计
由于在组内,英文碎片的边缘信息与汉字类似,因此我们同样采用误差评估函数c i jh ( , )来衡量两个碎片之间匹配程度。不同的是由于相对误差最小的碎片不一定是该碎片右侧的碎片。因此,我们做了如下的处理:
当两碎片的相对误差c i jh( , )  0.5时,接受碎片 j 作为碎片i 的右侧碎片,相反,则加入人工干预的方式,帮助判断是否为右侧碎片。
5.2.2.3 行间匹配
增加人工干预的方式,最终可以得到 11 组完整的碎片片段。同样利用行碎片上下边缘的信息,计算行片段之间上下边缘的误差评估值cw(p q, ) ,最终可以得到行片段的正确序列。
根据上述模型及算法,最终可得到 1119 个碎片在原始文件中的序列如下表所示:
表 7 附件 4 排序后碎片序列表
1
2 201 148 170 196 198 94 113 164 78 103 91 80 101 26 100 6 17 28 146
3 86 51 107 29 40 158 186 98 24 117 150 5 59 58 92 30 37 46 127
4 19 194 93 141 88 121 126 105 155 114 176 182 151 22 57 202 71 165 82
5 159 139 1 129 63 138 153 53 38 123 120 175 85 50 160 187 97 203 31 6 20 41 108 116 136 73 36 207 135 15 76 43 199 45 173 79 161 179 143
7 208 21 7 49 61 119 33 142 168 62 169 54 192 133 118 189 162 197 112
8 70 84 60 14 68 174 137 195 8 47 172 156 96 23 99 122 90 185 109 9 132 181 95 69 167 163 166 188 111 144 206 3 130 34 13 110 25 27 178
10 171 42 66 205 10 157 74 145 83 134 55 18 56 35 16 9 183 152 44
11 81 77 128 200 131 52 125 140 193 87 89 48 72 12 177 124 0 102 115

5.3 问题三——Two-Sides RCCSTD 问题研究
通过对问题三的分析,发现问题的解决方案基本与问题二类似,但针对正反碎片的特点,对问题二中的算法做了进一步的改进。
5.3.1 基于问题二算法的改进
(1) 边缘基准碎片的选择。由于一个碎片存在正反面的信息,因此在选择边缘基准碎片时,需要考虑正反面两侧边缘留白的情况。若某一碎片正反面两侧均有留白,说明该碎片为边缘基准碎片;相反则不是。这样可以选取到 22 组边缘基准碎片对(即一碎片的正反面)。
(2) 分组标准的确定。在问题二中,我们通过分析不同碎片基准线之间的差异性来判断两块碎片是否在同一行。而对于正反的碎片,可获取的信息更多。
因此采取下述标准进行分组:
若(a1,b1)为左侧基准碎片,(a2,b2)为右侧比较碎片,那么有右图所示的两种比较方式。同问题二的基准线误差计算方式,可以得到两组数据:
((l t1,lb1),(l t2,lb2))
其中,(l t1,lb1)表示在第一种情况下匹配,上下面基准线的差值;(l t2,lb2)表示在第二种情况下匹配,上下面基准线的差值。为了便于比较,我们作如下的简化:对于每一次匹配可以得到一组数据(l l1 2, ),其中,l1 lt1 lb1 2,l lt2 lb2。
那么,在分组过程中,依次取碎片分别与 22 组边缘基准碎片做匹配,得到 22 组共 44 个数据:(l11 21,,l ,;l12,,l22, ;…;l122, ,l 222, ),取其中的最小值对应的碎片即可将其归入相应的组。同时可判断匹配的方式,即:选取l1i 表示为第一种匹配方式,选取l 2i 表示为第二种匹配方式。这样可以将所有碎片分为 22 组,一些未归入任何组的碎片可放入地址池中。
(3)组内匹配算法的改进。对于同一组内的碎片,我们同样可以以误差评
估函数c i jh ( , )来衡量两个碎片之间匹配程度。不同的是在匹配的过程中,我们可以计算得到上下两面的误差值分别为ch1(i j, ) 和ch2(i j, ),为了便于比较,同样以
c i jh( , )  ch1(i j, )ch2(i j, )来作为衡量匹配程度的标准。c i jh ( , )越小,匹配度越好,即可作为被匹配碎片的右侧碎片。这样,可以得到 22 组碎片片段。
(4)行间匹配的改进。利用问题二中行间匹配的算法,计算上下面的误差
评估值的综合指标,即c i jw( , )  cw1(i j, )cw2(i j, )。最终可以拼接复原得到原始文件。
5.3.2 模型计算结果
由上述改进后的算法,最终可以计算得到附件 排序后碎片的序列如下两表
所示:
表 8 附件 5 排序后一面碎片序列表

1 136a 047b 020b 164a 081a 189a 029b 018a 108b 066b 110b 174a 183a 150b 155b 140b 125b 111a 078a 2 005b 152b 147b 060a 059b 014b 079b 144b 120a 022b 124a 192b 025a 044b 178b 076a 036b 010a 089b
3 143a 200a 086a 187a 131a 056a 138b 045b 137a 061a 094a 098b 121b 038b 030b 042a 084a 153b 186a
4 083b 039a 097b 175b 072a 093b 132a 087b 198a 181a 034b 156b 206a 173a 194a 169a 161b 011a 199a
5 090b 203a 162a 002b 139a 070a 041b 170a 151a 001a 166a 115a 065a 191b 037a 180b 149a 107b 088a 6 013b 024b 057b 142b 208b 064a 102a 017a 012b 028a 154a 197b 158b 058b 207b 116a 179a 184a 114b 7 035b 159b 073a 193a 163b 130b 021a 202b 053a 177a 016a 019a 092a 190a 050b 201b 031b 171a 146b
8 172b 122b 182a 040b 127b 188b 068a 008a 117a 167b 075a 063a 067b 046b 168b 157b 128b 195b 165a
9 105b 204a 141b 135a 027b 080a 000a 185b 176b 126a 074a 032b 069b 004b 077b 148a 085a 007a 003a
10 009a 145b 082a 205b 015a 101b 118a 129a 062b 052b 071a 033a 119b 160a 095b 051a 048b 133b 023a
11 054a 196a 112b 103b 055a 100a 106a 091b 049a 026a 113b 134b 104b 006b 123b 109b 096a 043b 099b

1 078b 111b 125a 140a 155a 150a 183b 174b 110a 066a 108a 018b 029a 189b 081b 164b 020a 047a 136b 2 089a 010b 036a 076b 178a 044a 025b 192a 124b 022a 120b 144a 079a 014a 059a 060b 147a 152a 005a 3 186b 153a 084b 042b 030a 038a 121a 098a 094b 061b 137b 045a 138a 056b 131b 187b 086b 200b 143b
4 199b 011b 161a 169b 194b 173b 206b 156a 034a 181b 198b 087a 132b 093a 072b 175a 097a 039b 083a
5 088b 107a 149b 180a 037b 191a 065b 115b 166b 001b 151b 170b 041a 070b 139b 002a 162b 203b 090a
6 114a 184b 179b 116b 207a 058a 158a 197a 154b 028b 012a 017b 102b 064b 208a 142a 057a 024a 013a
7 146a 171b 031a 201a 050a 190b 092b 019b 016b 177b 053b 202a 021b 130a 163a 193b 073b 159a 035a
8 165b 195a 128a 157a 168a 046a 067a 063b 075b 167a 117b 008b 068b 188a 127a 040a 182b 122a 172a
9 003b 007b 085b 148b 077a 004a 069a 032a 074b 126b 176a 185a 000b 080b 027a 135b 141a 204b 105a 10 023b 133a 048a 051b 095a 160b 119a 033b 071b 052a 062a 129b 118b 101a 015b 205a 082b 145a 009b 11 099a 043a 096b 109a 123a 006a 104a 134a 113a 026b 049b 091a 106b 100b 055b 103a 112a 196b 054b
由于算法的局限性,碎纸片在 cross-cut 的情况下需要人工参与决策。在我们的算法中,有两种情况需要进行人工干预。
情况一:在组内进行匹配时,我们选取误差值最小的碎片作为匹配的碎片,但在实际中误差值最小的碎片不一定为正确的匹配对象。因此,在问题二中,我们设计为:当最小的误差值小于 0.5 时,该碎片被完全接受;相反,当其大于 0.5 时,该碎片需要人工干预判断其是否被接受。
干预方式:如下图所示:

案例一:误差值大于0.5但匹配成功 案例二:误差值大于0.5但匹配失败当人工匹配接受时,输入 1;相反,人工匹配拒绝时,输入 0。
情况二:当组内匹配成功后,组间匹配失败的碎片片段,通过人工干预的方式完成组间的匹配。
干预方式:由于碎片片段数量有限,可通过观察直接获得位于同一行的两片段的序号。
六、模型检验与结果分析
6.1 碎纸片复原中文算法的检验
为了检验我们的模型是否具有较强的适用性,我们利用现有文档,将其裁剪后打乱顺序,随后利用复原算法对其进行复原,以此来检验算法。其步骤如下:
我们首先利用PDF XChange Viewer软件将下列所示PDF文档转换为bmp图像,然后利用 Photoshop 图像处理软件利用基准线和裁剪工具,将其划分为 196*2145像素点的10个碎纸片,然后随机编码这些碎纸片,利用碎纸片复原的中文算法对这些随机编码的碎纸片进行复原,以此来检验算法的正确性。

图 10 恢复后(b)分割前(a)的文档
经过与原文进行比较,可以得出我们的模型算法对于普遍的情况具有一定的适用性。
6.2 结果分析
利用我们的中文或英文复原算法可以将一堆碎纸片复原,但如何知道复原后的结果的正确性,我们上面是通过人工观察的方法,这对于复原大量碎纸片是效率很低的。为此我们利用OCR技术对复原得到后的图片进行文字提取。
如果复原结果很好,那么就会提取出文字,否则就会提取出大量乱码,如下所示:

图 11 OCR 提取复原程度较差的碎纸片后得到的文本
如果复原的很好,我们可以直接利用互联网上的搜索引擎提供的 API,将文本在互联网上进行搜索,若果搜索到很多相关结果,那么就可以基本证明我们的复原是可靠的,这一过程完全可以实现全自动化,而不需要人进行干预。
七、模型的进一步讨论
(1)模型中缺乏对于中英文混合的碎纸片复原算法的设计,可以考虑自动生成具有中英文混合的碎纸片,考察它们的特点,并针对它们的特点进行算法的改进和优化。(2)模型中可以考虑将适当的语料库加入,利用 OCR 工具将局部结果进行文字转化然后与语料库进行匹配,以提高模型的准确性,减少人工干预量。(3)现有模型的算法对于相关参数比较敏感,为了提高算法的适用性,可以尝试引入模拟退火算法、遗传算法、蚁群算法等智能算法。(4)模型中针对的碎纸片形状都是规则的矩形,而实际情况的碎纸片往往是不规则的,为了提高模型的适用性,可以考虑将形状的匹配纳入我们的模型。(5)模型中没有考虑实际情况中可能存在彩色字体,在碎纸片拼接的实际应用中可以考虑将颜色作为匹配的依据,这样能够适当提高模型的准确性。
八、模型优缺点表 10 模型的优缺点
优点 缺点
(1)模型中针对不同碎片类型和尺寸,具体问题具体分析,为每种情况设计了不同的算法实现了碎纸片的复原。 (1)模型中仅针对中文和英文的字符特点进行了匹配算法的设计,缺乏对中英文混合以及阿拉伯字符等更一般情况的考虑。
(2)为了能够结合计算机进行人工干预,我们专门在计算机很难分辨的特殊情况下设计了人工干预GUI界面,使得人工干预与机器复原巧妙地结合到了一起。 (2)算法的匹配准确率对于相关参数比较敏感,因此应用于不同碎纸片对象时需重新设定。
(3)模型中对于中文和英文的字符特点进行了充分挖掘,使得模型对于中文和英文的匹配准确度较高。 (3)模型中缺乏针对碎纸片的语义分析,人工干预量还有待进一步减少。

九、参考文献
[1] Christian Schauer, Matthias Prandtstetter, and Günther R.Raidl. A Memetic
Algorithm for Reconstructing Cross-Cut Shredded Text Documents. Institute of Computer Graphics and Algorithms Vienna University of Technology, Vienna, Austria.
[2] Johannes Perl, Markus Diem, Florian Kleber, and Robert Sablatnig. Strip Shredded Document Reconstruction Using Optical Character Recognition. In Imaging for Crime Detection and Prevention 2011 (ICDP 2011), 4th International Conference on, pages 1 –6, nov. 2011.
[3] 罗智中。.基于文字特征的文档碎纸片半自动拼接,计算机工程与应用。
2012,48(5) :207—210。
[4] 刘金根,吴志鹏。一种基于特征区域分割的图像拼接算法[J]。西安电子科技大学学报,2002,29(6):768-771。
[5] Prim, R.C.: Shortest Connection Networks and Some Generalizations. The Bell System Technical Journal 3,1389—1401(1957).
[6] 王剑文,戴光明,谢柏桥,张全元。求解 TSP 问题算法综述[J]。计算机工程与科学.2008(02)。
[7] 张辉,赵正德,杨立朝,赵郁亮. TSP 问题的算法与应用的研究[J]。 计算机应用与软件. 2009(04)。
十、附录
10.1 程序运行环境
本文题的解决主要在Mathwork matlab 中完成代码的编写和编译。计算机操
作系统:32 位 Win7 操作系统。软件环境:Matlab R2012b。
10.2 碎片拼接复原结果(1)附件 1 复原图

附图 1
(2)附件 2 复原图

附图 2
(3)附件 3 复原图

附图 3
(4)复原 4 复原图

附图 4
(5)复原 5 复原图
①其中一面

附图 5
②另外一面

附图 6
10.3 运行程序
10.3.1 main.m tic n=19;
[Edge,row]=match(n); rowNumber=length(row); %% Find the number of pixal of each line left and right edge in picture.
% count is a cell for storage of each line left and right edge pixal % number. for i=1:n temp=zeros; tempEdge=Edge{i}; for j=1:rowNumber
temp(j,1)=length(find(tempEdge(row(j):row(j)+40,1)==0)); temp(j,2)=length(find(tempEdge(row(j):row(j)+40,2)==0)); end count{i}=temp; end

%% First step is to find the shred with blank left. result=zeros(19); for j=1:n
if sum(count{1,j}(:,1))==0 result(1)=j; end end

%% Second step is to find the proper picture for the shred with blank left.
start=count{1,result(1)}; picturePool=dropPool([1:19],result(1)); pairA=result(1); number=2; tempSimilarity=zeros; while (~isempty(picturePool))

tempSimilarity=[];     for k=1:length(picturePool)         pairB=picturePool(k);         tempPic=count{1,picturePool(k)};             similarity=similar(start,tempPic); tempSimilarity=[tempSimilarity;pairA,pairB,similarity];             end

result(number)=tempSimilarity(find(tempSimilarity(:,3)==max(tempSimil arity(:,3))),2);
start=count{1,result(number)};
picturePool=dropPool(picturePool,result(number)); pairA=result(number); number=number+1;
end toc

10.3.2 main.m clc,clear tic n=209;
[image,I,Edge,Distance,grayEdge]=match(n); countLeft=1; countRight=1; for i=1:n tempEdge=Edge{i};
if length(find(tempEdge(:,1))==1)==180 && Distance(i,1)>5 leftHemp(countLeft)=i; countLeft=countLeft+1; continue; end
if length(find(tempEdge(:,2))==1)==180 && Distance(i,2)>5 rightHemp(countRight)=i; countRight=countRight+1; continue; end end

%% Find the number of pixal of each line left and right edge in picture.
% count is a cell for storage of each line left and right edge pixal % number. picType=[]; picDistance=[]; for i=1:n

[A,B]=pictureAttribute(I{i});     picType=[picType;A];     picDistance=[picDistance;B];

end

%%
%Create the remaining pool picturePool=[1:209]; nleft=length(leftHemp); nright=length(rightHemp); totalHemp=nleft+nright; for i=1:totalHemp if i<=length(leftHemp)
picturePool=dropPool(picturePool,leftHemp(i)); else
picturePool=dropPool(picturePool,rightHemp(i-nleft)); end end % totalPool=length(picturePool); pictureHemp=zeros(22,19); pictureCount=zeros(22,1)+1; count=totalPool*30; while (count~=0) tic
i=ceil(length(picturePool)*rand()); for j=1:totalHemp if j<=length(leftHemp)
if picType(leftHemp(j),1)==picType(picturePool(i),1) && picType(leftHemp(j),2)picType(picturePool(i),2) if
abs(picDistance(leftHemp(j),1)-picDistance(picturePool(i),1))❤️ && abs(picDistance(leftHemp(j),2)-picDistance(picturePool(i),2))❤️ pictureHemp(j,pictureCount(j,1))=picturePool(i); pictureCount(j,1)=pictureCount(j,1)+1; picturePool=dropPool(picturePool,picturePool(i)); break; elseif
abs(picDistance(leftHemp(j),1)-picDistance(picturePool(i),1))<8 && abs(picDistance(leftHemp(j),2)-picDistance(picturePool(i),2))<8 subplot(1,2,1),imshow(image{leftHemp(j)}); subplot(1,2,2),imshow(image{picturePool(i)}); prompt = {‘Á½ÕßÔÚͬһÐÐÂð£¿0 is ²»ÔÚ£¬1 is ÔÚ¡£’}; dlg_title = ‘È˹¤Åжϒ; num_lines = 1; def = {‘0’};
answer = inputdlg(prompt,dlg_title,num_lines,def); flag=str2num(answer{1,1}); if flag1 pictureHemp(j,pictureCount(j,1))=picturePool(i); pictureCount(j,1)=pictureCount(j,1)+1; picturePool=dropPool(picturePool,picturePool(i)); break; end end
end
else

     if picType(rightHemp(j-nleft),1)==picType(picturePool(i),1) && picType(rightHemp(j-nleft),2)==picType(picturePool(i),2)              if

abs(picDistance(rightHemp(j-nleft),1)-picDistance(picturePool(i),1))<
3 &&
abs(picDistance(rightHemp(j-nleft),2)-picDistance(picturePool(i),2))<
3
pictureHemp(j,pictureCount(j,1))=picturePool(i); pictureCount(j,1)=pictureCount(j,1)+1; picturePool=dropPool(picturePool,picturePool(i)); break; elseif
abs(picDistance(rightHemp(j-nleft),1)-picDistance(picturePool(i),1))<
3 &&
abs(picDistance(rightHemp(j-nleft),2)-picDistance(picturePool(i),2))<
3

         subplot(1,2,1),imshow(image{picturePool(i)});              subplot(1,2,2),imshow(image{rightHemp(j-nleft)});              prompt = {'Á½ÕßÔÚͬһÐÐÂð£¿0 is ²»ÔÚ£¬1 is ÔÚ¡£'};              dlg_title = 'È˹¤ÅжÏ';              num_lines = 1;              def = {'0'}; answer = inputdlg(prompt,dlg_title,num_lines,def);              flag=str2num(answer{1,1});              if flag==1 pictureHemp(j,pictureCount(j,1))=picturePool(i);                  pictureCount(j,1)=pictureCount(j,1)+1;                  picturePool=dropPool(picturePool,picturePool(i));                  break;              end               end          end end end     toc     count=count-1; end

%% First step is to find the shred with blank left.
leftHeadPool=leftHemp;
RightHeadPool=leftHemp;

for i=1:totalHemp if i<=nleft Head=leftHemp(i); sequence=pictureHemp(i,:);

    [result,leftHeadPool,RightHeadPool,picturePool] =

LeftToRightMatch( Head,grayEdge,sequence,leftHeadPool,RightHeadPool,p icturePool,pictureHemp,rightHemp,picType,picDistance); leftResult{i}=result; else
Head=rightHemp(i-nleft); sequence=pictureHemp(i,:);

    [result,leftHeadPool,RightHeadPool,picturePool] =

RightToLeftMatch( Head,grayEdge,sequence,leftHeadPool,RightHeadPool,p icturePool,pictureHemp,leftHemp,picType,picDistance); rightResult{i-nleft}=result; end end

%% Second step is to find the proper picture for the shred with blank left.
start=count{1,result(1)}; picturePool=dropPool([1:19],result(1)); pairA=result(1); number=2; tempSimilarity=zeros; while (~isempty(picturePool))

tempSimilarity=[];     for k=1:length(picturePool)         pairB=picturePool(k);         tempPic=count{1,picturePool(k)};         similarity=similar(start,tempPic); tempSimilarity=[tempSimilarity;pairA,pairB,similarity];     end

result(number)=tempSimilarity(find(tempSimilarity(:,3)==max(tempSimil arity(:,3))),2);
start=count{1,result(number)};
picturePool=dropPool(picturePool,result(number)); pairA=result(number); number=number+1; end toc

10.3.3 main.m clc,clear tic n=209;
[image,I,Edge,Distance,grayEdge]=match(n);
%% Find the picture with left and right blank.
% countLeft=1; for i=1:n flag=0;
tempEdge=Edge{1,i};
if (length(find(tempEdge(:,1)==1))==180 && Distance(i,1)>4) ||
(length(find(tempEdge(:,2)==1))==180 && Distance(i,2)>4)

       tempEdge=Edge{2,i}; if (length(find(tempEdge(:,1)==1))==180 &&

Distance(209+i,1)>4) || (length(find(tempEdge(:,2)==1))==180 &&
Distance(209+i,2)>4)
leftHemp(countLeft)=i; countLeft=countLeft+1; continue;
end
end end

%% Find the number of pixal of each line left and right edge in picture.
% count is a cell for storage of each line left and right edge pixal % number. picType=[]; picDistance=[]; for i=1:n tempA=[]; tempB=[]; for row=1:2
[A,B]=pictureAttribute(I{row,i}); tempA=[tempA A]; tempB=[tempB B]; end
picType=[picType;tempA]; picDistance=[picDistance;tempB]; end
picturePool=[1:209]; picturePool=[picturePool;picturePool]; nleft=length(leftHemp); for i=1:nleft
tempPool1=dropPool(picturePool(1,:),leftHemp(i)); tempPool2=dropPool(picturePool(2,:),leftHemp(i)); picturePool=[tempPool1;tempPool2]; end

% totalPool=length(picturePool); pictureHemp=zeros(11,19); pictureCount=zeros(11,1)+1; count=totalPool*60; while (count~=0) tic
i=ceil(length(picturePool)*rand()); error=[]; for j=1:nleft
error=[error;leftHemp(j) picturePool(i) (picType(leftHemp(j),1)==picType(picturePool(i),1) && picType(leftHemp(j),2)==picType(picturePool(i),2))
abs(picDistance(leftHemp(j),1)-picDistance(picturePool(i),1))+abs(pic Distance(leftHemp(j),2)-picDistance(picturePool(i),2))]; end
temp=(find(error(:,4)==min(error(:,4)))); ti=length(temp);
for k=1:ti % for j=1:nleft if error(temp(k,1),3)==1

pictureHemp(temp(k,1),pictureCount(temp(k,1),1))=picturePool(i); pictureCount(temp(k,1),1)=pictureCount(temp(k,1),1)+1; picturePool=dropPool(picturePool,picturePool(i)); break; end %end end toc count=count-1; end

%% First step is to find the shred with blank left. leftHeadPool=leftHemp;
for i=1:nleft

    Head=leftHemp(i);         sequence=pictureHemp(i,:); [result,leftHeadPool,picturePool] =

LeftToRightMatch( Head,image,grayEdge,sequence,leftHeadPool,picturePo ol,picType,picDistance); leftResult{i}=result;
end

%% Second step is to find the proper picture for the shred with blank left.
start=count{1,result(1)}; picturePool=dropPool([1:19],result(1)); pairA=result(1);
number=2; tempSimilarity=zeros; while (~isempty(picturePool))

tempSimilarity=[];     for k=1:length(picturePool)         pairB=picturePool(k);         tempPic=count{1,picturePool(k)};         similarity=similar(start,tempPic); tempSimilarity=[tempSimilarity;pairA,pairB,similarity];     end

result(number)=tempSimilarity(find(tempSimilarity(:,3)==max(tempSimil arity(:,3))),2);
start=count{1,result(number)};
picturePool=dropPool(picturePool,result(number)); pairA=result(number); number=number+1; end toc

2013数学建模B题碎纸片拼接复原参考资料相关推荐

  1. 2003年国赛数学建模B题碎纸片拼接复原问题参考

    一.MATLAB思路 Step 1:读取图片内容 Step 2:生成匹配率矩阵 Step 3:生成邻接关系 Step 4:寻找第一张图片 Step 5:生成拼接顺序并储存 Step 6:完整图片呈现 ...

  2. 2013年数学建模国赛B题(碎纸片拼接复原的设计与实现)优秀论文.doc

    本博客下载链接包含修改的word版本, 可免费下载阅览学习, 也可作为数学建模相关课程作业修改上交: 链接:https://pan.baidu.com/s/1KBg5K-XXvFy5hAw8QHoIz ...

  3. 数学建模2013年B题——碎纸片拼接复原

    摘要 基于目前传统的手工拼接复原碎纸片的现状和碎纸片拼接复原的实际需求,本文通过对5个附件中的碎纸片文件进行半自动复原,以研究碎纸片复原的模型和算法,希望通过此种模型和算法减少碎纸片复原的效率.准确度 ...

  4. 2013年国模 B题 碎纸片拼接

    重新做下2013年国模 B题 碎纸片拼接,只怪当年太年轻啊,现在再看这道题就是单人solo的节奏........ 1,2太简单,就不做了,3,4选第四题做一下,第3题是中文,字方方正正,比英文要简单, ...

  5. 2021年华数杯数学建模A题电动汽车无线充电优化匹配研究求解全过程文档及程序

    2021年华数杯数学建模 A 题 电动汽车无线充电优化匹配研究 原题再现:   电动汽车以环境污染小.噪音低.能源利用效率高.维修方便等优势深受消费者青睐.但现有电动汽车的有线充电方式操作复杂,且存在 ...

  6. 2022数维杯国际数学建模C题代码+思路+报告

    2022数维杯国际数学建模C题 目录 2022数维杯国际数学建模C题 数据说明 Task1 数据分析 Task2 筛选出脑结构特征和行为结构特征 两表合并 随机森林分类 随机森林参数输出 Task3 ...

  7. 2022华为杯数学建模B题——方形件组批优化问题

    本文章用于记录2022华为杯数学建模B题--方形件组批优化问题 提醒:大家最终提交的时候记得是pdf文件,不是word文件. 第一次参加建模比赛,经验不足,准备不充分,能力也欠缺.考虑2023年继续再 ...

  8. 全国计算机建模三等奖,2009年全国数学建模真题(论文获国家 三等奖).doc

    2009年全国数学建模真题(论文获国家 三等奖) 制动器试验台的控制方法分析 摘要 制动器的作用在于使行驶减速或者停止,其设计是车辆设计中最重要的环节之一,直接影响着人身和车辆的安全.本文分析了制动器 ...

  9. 98年建模a题论文_2020年 MathorCup数学建模 A题 无车承运人平台线路定价问题,定价评价...

    想要看更加舒服的排版.更加准时的推送 关注公众号"不太灵光的程序员" 每日八点有干货推送,微信随时解答你的疑问 公众号"不太灵光的程序员" 同时发布<20 ...

最新文章

  1. 从设置、加载、启动看Xilinx FPGA配置流程
  2. Android项目的目录结构
  3. C语言 - sizeof和strlen的区别
  4. 联海网站开发-操作说明-会员系统及诵读之星
  5. static成员函数和static成员
  6. 怎么改电脑网络ip地址_抛弃重启路由器获取ip地址方式,巧妙运用ip代理改IP工具...
  7. 终于下决心写一写自己的博客了!
  8. 【RS|概念】辐射校正和几何纠正
  9. 超定方程组的经典Gram-Schmidt正交化解法
  10. 2021年大数据面试宝典完整版(含答案解析)
  11. Qt样式表Qss(什么是QSS;基本语法;setStyleSheet函数;样式表的属性值;利用QtCreate实现样式切换;样式表实现皮肤改变实例)
  12. .mdb mysql_ACCESS数据库(.mdb 文件)转 MYSQL
  13. L19.linux命令每日一练 -- 第三章 文件过滤及内容编辑处理命令 -- tailf和cut命令
  14. 大数据和数据挖掘之间,主要有什么关系?
  15. jersey 过滤_Jersey 开发RESTful(十五) Jersey的拦截器
  16. 当耐克用上了AI、AR技术,你的鞋也要放飞自我了?Just Do It !
  17. HTML5+CSS大作业——汽车自驾游(10页) 自驾游主题HTM5网页设计作业成品
  18. Java程序:如何将句子(字符串)中的字母大小写转化
  19. dns服务器未响应重启就好,网络诊断提示DNS服务器未响应解决方法 - 全文
  20. 几种常用的mosfet驱动电路

热门文章

  1. C51单片机实现双机通讯
  2. Twenty-third
  3. svga文件预览_工作案例分享:SVGA动效落地的使用与避坑
  4. 企业微信裂变系统小程序功能模块源码1.0.3
  5. 关于 UI设计 切图,我们应该如何给开发人员
  6. uniapp微信小程序唤起微信界面的聊天客服
  7. outlook中可以添加html代码,在ICS文件中为Outlook预约添加HTML
  8. 云安对于数据中心容灾恢复及数据库监控
  9. 如何在手机端从多个Excel文件多个Sheet中搜索某一内容,多个excel文件批量查找
  10. Unity 项目HTCvive中 PPT播放的实现