这是毕业之后写的第一篇博客,在这里我想把做毕设的过程和所需要的资料说清楚。
老师说这是一个研究生的毕业设计题目,有点难度。 之所以当时选了这个题目是因为感觉它比较有意思。 在最开始的几个星期里,由于数字图像处理相关知识的欠缺,完全不知道怎么下手去做,头发快愁白了。从头到尾学一遍matlab图像处理,时间来不及;逛论坛发帖子似乎也没多大用;看论文又觉得废话太多实在没耐心......做毕业设计的各种现象~
废话不说,现在看需求(来自设计任务书):
设计要求学生以手撕产生的不规则破碎纸片的复原为背景,设计、开发一套“手撕不规则碎纸片复原系统”软件。该系统可用于各种文件,票据等手撕产生的不规则碎纸片的形状特征的数字化,形状特征的提取,复原等。
此外,学生通过该题目的设计过程,可以初步掌握软件系统的开发原理和开发方法,得到软件工程的训练,提高解决实际问题的能力。
(1)整个系统由待复原资料上传子系统、特征提取子系统、复原结果发布子系统及复原结果的评价分析子系统等组成;
(2)系统要支持人工干预功能(是否需要人工干预,如果需要,说明干预的时间点及干预方法);
(3)系统要实现对于来自同一页(无缺失,无多余)的印刷文字,手写文字,常见票据的手工撕碎后的不规则碎纸片的上传、数字化、形状特征提取及复原的功能;
(5)该系统的开发,采用Matlab(实现功能部分)和Java(实现界面部分)技术;
(6)系统要采用模拟手撕碎纸片资料进行测试。
说的比较官方,官方的东西让人觉得没有胃口。 什么子系统子系统的,说是功能不就结了。四个功能:上传、特征提取、复原、评价;
开始做的时候没有必要拘泥于这些东西,有了想法和思路,最后实现功能才是工作重点。 但是做完之后还得编四五十页废话连篇的说明文档,再写个4页的简介,翻译一篇一万字符以上的外文文献,整个PPT,刻光盘……总之不能让你闲着。
关于设计中的“人工干预”现在肯定不太理解,不过后面一定会知道它是干预什么了。
现在可以回到题目中, “手撕不规则的碎纸片”重点要抓住“不规则”三个字, 它就说明,设计一定要基于碎片的形状特征出发来实现,若以其它的非形状的特征出发,很可能就跑题了。对于碎纸机中切割出来的规则碎纸的复原,一定不是这个题目要做的事情,其他人在做,咱就不操心了。
利用数字图像的形状特征实现复原,第一步就是碎纸片特征的提取工作。人工拼接,大多数情况下也是根据碎片的形状来判断,偶尔也会结合碎片上面的图案来判断。拼图游戏是根据图案判断的,它的每个碎片形状一致。不知道图片里面数据是怎么样的?用记事本打开一堆乱码……不知道如何提取形状特征? 不怕人笑话,此时需要学习了。
图像:
在数字图像处理领域,图像分为模拟图像和数字图像两种,在计算机上处理的图像均为数字图像。根据数字图像在计算机中表示方法不同,分为二进制图像,索引图像,灰度图像,RGB图像和多帧图像。
数字图像的产生主要有两种渠道,一种是通过像数码照相机这样的设备直接拍摄得到数字图像,还有一种是通过图像采集卡、扫描仪等数字化设备,将模拟图像转变为数字图像。 下图是拍摄获得的一张碎纸片(RGB)图像:
图像的表示:
图像的表示方法是对图像处理算法描述和利用计算机处理图像的基础。一个二维图像,在计算机中通常为一个二维数组f (x, y),或者是一个M×N的二维矩阵(其中,M为图像的行数,N为图像的列数)下面介绍5种图像的表示方法:二进制图像、索引图像、灰度图像、RGB图像和多帧图像。
二进制图像也称为二值图像,通常用一个二维数组来描述,1位表示一个像素,组成图像的像素值非0即1,没有中间值,通常0表示黑色,1表示白色,如图1.8所示。二进制图像一般用来描述文字或者图形,其优点是占用空间少,缺点是当表示人物或风景图像时只能描述轮廓。
灰度图像也称为单色图像,通常也由一个二维数组表示一副图像,8位表示一个像素,0表示黑色,255表示白色,1~254表示不同的深浅灰色,一副灰度图像放大4×4大小像素,如图1.9所示。通常灰度图像显示了黑色与白色之间许多级的颜色深度,比人眼所能识别的颜色深度范围要宽的多。
RGB图像也称为真彩色,是一种彩色图像的表示方法,利用3个大小相同的二维数组表示一个像素,3个数组分别代表R、G、B三个分量,R表示红色,G表示绿色,B表示蓝色,通过三种基本颜色可以合成任意颜色,如图1.10所示RGB图像。每个像素中的每种颜色分量占8位,每一位由[0,255]中的任意数值表示,那么一个像素由24位表示,允许的最大值为224(即1677216,通常记为16M)。
索引图像是一种把像素值直接作为RGB调色板下标的图像。在MATLAB中,索引图像包含一个数据矩阵X和一个颜色映射(调色板)矩阵map。数据矩阵可以是8位无符号整型、16位无符号整型或双精度类型的。
多帧图像是一种包含多幅图像或帧的图像文件,又称为多页图像或图像序列,主要用于需要对时间或场景上相关图像集合进行操作的场合。例如,计算机X线断层扫描图像或电影帧等。
对于数字图像了解到这里就够了,如果还没有安装matlab建议现在赶紧装一个。处理数字图像,没有这个可不行,尽量安装高一点的版本,如Matlab2012a,至于为什么,后面再说。
安装好之后,建个文件夹,把工作目录切换过去。 它的命令行很方面,用过RedHat或者Ubuntu的同鞋直接在命令窗口中切cd ..ls ..不会的就在当前目录窗口中用鼠标点吧。接下来随便找一张图片,试试这些命令 [ MATLAB图像处理工具箱函数], 试着写m文件,观察一下各种类型图片的数据长的是什么样子,试试不同类型图片的转换,可以将matlab读到的图片数据输出,输入I(读入的变量)+回车就行。
如何提取碎片图像的轮廓:
图像分割技术,图像分割就是把图像分成各具特性的区域,并提取出感兴趣目标的技术。图像分割在很多领域都有着非常广泛的应用,并涉及各种不同类型的图像。图像分割技术,主要包括边缘分割技术、阈值分割技术和区域分割技术等。
边缘检测是利用物体和背景在某种图像特性上的差异来实现的。常见的边缘检测方法有:微分算子、Canny算子和LOG算子等。常用的微分算子有Sobel算子、Roberts算子Prewit算子等。阈值分割技术是最简单的一种图像分割方法,关键在于寻找合适的阈值,通常根据图像的直方图来选取。除了边缘分割和阈值分割等方法以外,还可以采用区域分割。区域分割主要包括区域生长法和分水岭分割法。
在这里不采用边缘检测的方法,我们用边界追踪的方法来获取碎纸片的轮廓特征,具体原因参考 中国知网的边界追踪搜索结果。
边界跟踪的算法参考[ matlab图像分割算法源码 - 尘封已久的日志 - 网易博客]的第11个方法。
下面开始写程序,不知道matlab的数据类型和函数写法,请找找 [ 《精通matlab图像处理》张强 王正林编写] 电子工业出版社出版。
试完博客中提到的第11种边界跟踪的方法,似乎已经能将碎纸片图像的轮廓曲线提取出来了。
提取出来碎纸片轮廓的图像:
用whos查看matlab中的数据:
contour
大小n*2
类型double 轮廓坐标
到这里轮廓的提取已经完成了,接下来是轮廓的表示,轮廓表示也有很多种方法,通常分为两类,一类是编码方式,如链码,游程码,freeman码。 一类是对轮廓的简化表示, 如样条,多边形逼近和特征点提取等的表示方法。
链码:链码用于描述目标图像的边界,通过规定链的起始坐标和链起始点坐标的斜率用一小段线段来表示图像中的曲。链码按照标准方向的斜率分为4向链码或8向链码,如下图所示。因为链码表示图像边界时只需标记起点坐标,其余点用线段的方向数代表方向即可,这种表示方法节省大量的存储空间。
将边界跟踪得到的碎片轮廓数据contour编程转化为链码来表示,用8方向的链码表示。表示完成之后需要将要做匹配的两条链码中的其中一条进行反方向的转化,因为在边界跟踪的时候用统一方向 比如顺时针 进行跟踪的,统一方向的两条链码没有办法进行匹配运算,所以要将边界跟踪的一条链码做相反方向的转化。
在这里隆重介绍一种基于链码的二维碎片轮廓匹配算法,学会之后,最难搞的碎纸片匹配就完成了。
上面这些过程仅供参考,方法还有很多,没有多少基础的话是摸着石头过河,把当前的问题解决了就好,走多少弯路没关系。