基于碎纸片的拼接复原算法及MATLAB实现

一、问题描述

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

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

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

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

二、拼接中存在的几个主要问题及解决方案

为了将碎片拼接成一幅完整的图片,需要解决的问题有以下几个方面:

  1. 如何判断两个碎片是否为相邻碎片?
  2. 如何控制两两拼接的循环执行直至拼接完成?
  3. 如何判断碎片是否为边界碎片?
  4. 如果碎片的某个边界刚好完全是空白,则将其判断为原图的边界还是相邻文字的空隙?

(5) 对于既有纵切又有横切的单面图片,如何拼接?

(6) 对于对于既有纵切又有横切的双面图片,如何拼接?

 针对上述问题,我们给出以下解决方案:

1.问题(1)的解决方案

为了减少计算量和便于处理,我们将原灰度图像转换成二值图像,此转换不影响文字类图片的质量,也不会影响拼接效果。

一般而言,相邻碎片的边缘都具有很强的相似性,我们通过判断碎片矩阵的对应边界列的相似程度来确定两矩阵存储的碎片是否为相邻碎片。为了确定两列向量的相似程度,我们利用其信噪比值psnr来衡量,psnr的值越大,说明两者的相似程度越高。在拼接过程中可能会存在这种现象:也许存在多幅待拼碎片与已拼图片的信噪比相同,为了从中选择一幅正确的碎片作为当前碎片的邻接碎片,我们可以人为介入从语义上进行判断。也有可能待拼碎片与已拼图片的信噪比大,但是并不是已拼图片的邻接图片,反而次小信噪比的碎片是邻接碎片。这是因为用信噪比去衡量邻接碎片边缘的相似度也存在概率性误差。对于以上两种情况,我们都需要在程序运行期间进行人工干预,即程序在拼接时需要与用户进行交互。思想如下:拼接函数f2()和f3()拼接时都会将当前已拼图片与所有待拼碎片的信噪比进行求解,并将所得信噪比序列存入一维数组中,然后通过排序函数paixu2()进行自小而大的排序,然后通过循环控制,从已排序数组的最后一个元素逐个向前尝试,每尝试一次都要与用户交互,用户根据图片语义判断拼接正确与否,如果正确,则给出‘YES’的输入,程序终止拼接;如果否,则给出‘NO’的输入,程序继续尝试剩余碎片,直到找到正确邻接碎片为止。实验证明,用该种方法对单纯纵切碎片的情况非常有效。

2.问题(2)的解决方案

在拼接的过程中,需要考虑如下几种情况:

① 如果选取的第一幅碎片刚好是原图的左侧边缘碎片,则只需要在其右侧进行拼接,直到完毕。

② 如果选取的第一幅碎片刚好是原图的右侧边缘碎片,则只需要在其左侧进行拼接,直到拼接完毕。

③ 如果选取的第一幅碎片刚好是原图的内部某一碎片,则既要进行右侧拼接,又要进行左侧拼接。

针对以上三种情况,我们编写了两个拼接函数,其中函数f2()实现两碎片的右侧拼接,函数f3()实现两碎片的左侧拼接。通过反复调用两函数实现整幅图的拼接。为了确定是选择函数f2()还是函数f3(),依照以下思路进行:

从所有碎片中首先选择一个碎片,判断其是否为右侧边缘碎片,如果否,则对其进行右侧拼接,则反复调用右拼函数f2(),直到右边缘,然后再调用左拼函数f3()进行左拼,直到左边缘;如果是,则直接调用左拼函数f3()进行左拼,直到左边缘。

3.问题(3)的解决方案

在拼接过程中需要判断是否已经拼接到原图的边缘,为了解决该问题,我们在设计函数f2()和f3()时,分别用它们的返回值的一个分量来标志是否调用成功。如果函数按psnr的逆序试了所有剩余碎片都未能找到合适的碎片,说明当前待拼图片是边界图片, 此时返回值分量flag的值为0,否则返回1。

4.问题(4)的解决方案

对于此种情况可以不做特殊处理,只需要调用拼接函数f2()或f3()进行拼接。如果刚好是边界,而剩余碎片个数为n,则人机交互n次才能判断该图片为边界碎片,而且人为根据语义做出判断时,也浪费了很多精力。为了避免该情况发生,我们将边界完全为空白的情况处理为边界。也可以在程序中直接把该处理对应的代码去掉,其余代码不需做任何改动,不足是增加了人工干预次数。当然,我们假定,在纵切时没有刚好完全切在空白处的情况,否则程序会给出错误的结果。程序实现时,具体处理方法如下:以f2()为例,首先测试碎片矩阵的大小,如果该碎片矩阵的右侧边界分量各元素值的和与碎片的行数之差小于一个阀值,我们就认为该碎片为边缘碎片,停止拼接。因为碎片已被处理为二值图像,在二值图像中,白色像素值为1,黑色像素值为0,而边缘通常是纯白的,在考虑有极少杂色的情况下,我们给了一个阀值。左侧边缘判定方法一样。

5.问题(5)的解决方案

对于既有纵切又有横切的图片,我们按如下思想进行拼接:利用纵切图片的拼接思想首先将碎片拼接成多个横条图片,然后将每个横条图片的矩阵进行转置,最后再次利用纵切拼接思想对横条图片进行拼接,拼接完毕后,将得到的最终矩阵进行转置,最终得到整幅图片。在实现过程中,存在以下细节需要处理:

整个过程中需要多次调用纵切拼接函数将碎片拼接成多个横条图片,所以,需要在每次成功拼接一个横条图片时将当前已参与拼接的碎片从剩余碎片中分离出来,这就需要用到分离函数ff()。

6.问题(6)的解决方案

   单面纵横切的算法和思想完全可以拓展到双面纵横切的情形,区别在于:在将所有碎片拼接成横条形图片后,再进行横条拼接时要产生两幅图像。为了能生成两幅图像,需要在单面纵横切拼接算法的基础上做以下处理:在拼接过程中要将参与拼接的图片与剩余图片分离出来;从一个图片开始拼起,如果遇到两个边界都已经找到了,说明第一个图片已经拼接完毕,然后再将剩余碎片拼接成另一面图像。因时间关系,我们未能编程实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471041.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP多门店医疗服务系统小程序源码

🏥 多门店医疗服务系统:打造全方位健康守护网络 🏥 🏷️ 引言:为何需要多门店医疗服务系统? 在这个快节奏的时代,健康成为了我们最宝贵的财富。然而,面对突如其来的疾病或日常的健…

Jetpack 之 Ink API初探

前言 近期看到谷歌官方推文有一篇关于Jetpack Ink API的文章,随即进行了了解和研究,该SDK主要就是低延时的手写绘制,比如通过手指或者触控笔在安卓设备上面进行笔记记录或者在安卓设备上面进行素描之类类似于纸张上面的操作。当然了可能现在…

SpringBoot参数注解

SpringBoot参数注解 常用参数注解 RequestParmPathVariableRequestHeaderCookieValueRequestbody 1.请求参数注解:RequestParm 用途:用于将方法参数绑定到URI查询参数或者表单参数。他可以帮助我们或者HTTP请求中的参数值并将其作为方法的参数进行处…

HarmonyOS的@State装饰器的底层实现

HarmonyOS的State装饰器的底层实现 序言准备工作实现State装饰器 序言 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript(简称TS)基本语法风格的基础上,进一步通过规范强化静态检查和分析,使得在程序运行之前的开发期能检测更…

C语言 | Leetcode C语言题解之第557题反转字符串中的单词III

题目&#xff1a; 题解&#xff1a; char* reverseWords(char* s) {int length strlen(s);char* ret (char*)malloc(sizeof(char) * (length 1));ret[length] 0;int i 0;while (i < length) {int start i;while (i < length && s[i] ! ) {i;}for (int p …

响应式网页设计--html

一&#xff0c;HTML 文档的基本结构 一个典型的 HTML 文档包含了几个主要部分&#xff0c;基本结构如下(本文以下出现的所有代码都可以套入下面示例进行测试)&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8&q…

Linux git-bash配置

参考资料 命令提示符Windows下的Git Bash配置&#xff0c;提升你的终端操作体验WindowsTerminal添加git-bash 目录 一. git-bash配置1.1 解决中文乱码1.2 修改命令提示符 二. WindowsTerminal配置git-bash2.1 添加git-bash到WindowsTerminal2.2 解决删除时窗口闪烁问题 三. VS…

【HarmonyOS NEXT】一次开发多端部署(以轮播图、Tab栏、列表为例,配合栅格布局与媒体查询,进行 UI 的一多开发)

关键词&#xff1a;一多、响应式、媒体查询、栅格布局、断点、UI 随着设备形态的逐渐增多&#xff0c;应用界面适配也面临着很大问题&#xff0c;在以往的安卓应用开发过程中&#xff0c;往往需要重新开发一套适用于大屏展示的应用&#xff0c;耗时又耗力&#xff0c;而鸿蒙提供…

向日葵软件Windows系统连接苹果系统(MacOS)的无反应问题解决办法

前言 向日葵软件最近开始收费了的&#xff0c;打算收割我们。这也是没有办法的事情&#xff0c;毕竟他们的程序员也是需要吃饭的&#xff0c;我也表示理解。 所以&#xff0c;我在连接了几次发现反应很迟钝后&#xff0c;果断的买了158元的包年会员。 但是&#xff0c;在买了会…

neo4j desktop基本入门

下载安装不在赘述&#xff0c;本文只记述一些neo4j的基本入门操作 连接本地neo4j数据库 1. 点击ADD添加连接 端口一般是7687 账户名和密码忘记了&#xff0c;可以通过neo4j web&#xff08;默认为neo4jneo4j://localhost:7687/neo4j - Neo4j Browser&#xff09;重置密码 AL…

编写红绿起爆线指标(附带源码下载)

编写需求&#xff1a; 想问问有没有能标注行情起爆点的指标。 效果展示&#xff1a; 红线上&#xff0c;出现绿柱转红柱做多。 蓝线下&#xff0c;出现红柱转绿柱做空。 源码展示&#xff08;部分源码&#xff0c;完整源码需下载源码文件&#xff09;&#xff1a; IsMainIn…

ubuntu20.04 解决Pytorch默认安装CPU版本的问题

ubuntu20.04 解决Pytorch默认安装CPU版本的问题 在使用Anaconda安装支持CUDA的PyTorch版本时&#xff0c;遇到只能安装CPU版本的PyTorch是一个常见问题。这通常由于Anaconda环境配置、镜像源设置不当或版本匹配问题导致。以下是详尽的解决方案和步骤&#xff0c;以确保能够正确…

C++《继承》

在之前学习学习C类和对象时我们就初步了解到了C当中有三大特性&#xff0c;分别是封装、继承、多态&#xff0c;通过之前的学习我们已经了解了C的封装特性&#xff0c;那么接下来我们将继续学习另外的两大特性&#xff0c;在此将分为两个章节来分别讲解继承和多态。本篇就先来学…

数字孪生在智慧能源项目中的关键作用,你了解多少?

随着能源行业不断向智能化、数字化转型&#xff0c;数字孪生技术在智慧能源项目中扮演的角色愈发重要。数字孪生不仅带来了前所未有的资源优化和成本节约方式&#xff0c;还为整个能源系统的可持续运营奠定了坚实基础。那么&#xff0c;为什么数字孪生技术在智慧能源项目中如此…

Window下PHP安装最新sg11(php5.3-php8.3)

链接: https://pan.baidu.com/s/10yyqTJdwH_oQJnQtWcwIeA 提取码: qz8y 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 (链接失效联系L88467872) 1.下载后解压文件&#xff0c;将对应版本的ixed.xx.win文件放进php对应的ext目录下&#xff0c;如图所示 2.修改ph…

Postman上传图片如何处理

打开Postman&#xff0c;创建一个新的请求 URL: http://90.104.232.49:80/dev-api/appcommon/upload 如果有解密进入上传就在请求头添加 点击“Body”选项卡。 选择“form-data”类型。 在“KEY”列中输入文件字段的名称&#xff0c;例如file。 在“VALUE”列中&#xff0…

陪诊问诊APP开发实战:基于互联网医院系统源码的搭建详解

时下&#xff0c;开发一款功能全面、用户体验良好的陪诊问诊APP成为了医疗行业的一大热点。本文将结合互联网医院系统源码&#xff0c;详细解析陪诊问诊APP的开发过程&#xff0c;为开发者提供实用的开发方案与技术指导。 一、陪诊问诊APP的背景与功能需求 陪诊问诊APP核心目…

Leecode热题100-35.搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…

Axure设计之文本编辑器制作教程

文本编辑器是一个功能强大的工具&#xff0c;允许用户在图形界面中创建和编辑文本的格式和布局&#xff0c;如字体样式、大小、颜色、对齐方式等&#xff0c;在Web端实际项目中&#xff0c;文本编辑器的使用非常频繁。以下是在Axure中模拟web端富文本编辑器&#xff0c;来制作文…

【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)

事务的隔离级别 1. 如何理解事务的隔离性2. 事务隔离级别的分类3. 查看和设置事务隔离级别3.1 全局和会话隔离级别3.2 查看和设置隔离级别 4. 事务隔离级别的演示4.1 读未提交&#xff08;Read Uncommitted&#xff09;4.2 读已提交&#xff08;Read Committed&#xff09;4.3 …