对给定的图像LBimage3(如下图所示)进行滤波,去除光照影响,再进行二值化处理,得到较完整的数字和符号。
- 可用matlab或VC++等语言编程,用matlab编程时,设计中除了读写、显示、数据类型转换等函数外以外,其它主要功能函数需自己编写。
- 所有设计内容要在一个主程序中运行实现,分步骤实现设计要求。
- 设计报告中需要分析影响结果的多种因素。
1)编写最小值滤波器,并测试。
2)用原图减去光照图得到无光照图,并与原图比较是否去除光照。
3)对无光照图进行灰度拉伸。
4)编写二值化函数,对拉伸后的图像进行二值化,得到最终结果。
下面是程序中涉及到的三个自定义函数:
程序源代码主要有三个版本,其中GUI界面版主要是将操作和结果都在UI界面中显示,实时编辑器版能够实时看到每一步处理的结果, 而模糊增强版是另一种滤波方法。 三种方法的处理结果如下:
从实验结果来看基本达到设计要求。对比实验结果发现使用模糊增强效果更好。
影响实验结果的主要因素有:
- 滤波器的选择,不同的滤波器产生的结果不同。
- 模板的大小,模板过大或者过小都达不到理想的效果。
- 相关参数的选择,不同的参数,以及参数的大小对实验的结果影响都不同。如果选择不合适也达不到理想的效果。
- 滤波器使用的顺序不同,最终的结果也会不同。
- 同态滤波: 一开始用同态滤波对图像进行去除光照处理,但后来发现其滤波函数的参数很难调到一个合适的值,而且同态滤波中需要编写一维和二维的快速傅立叶变换和反变换函数,以前做实验的时候傅立叶的变换和反变换有问题,因为对蝶形运算没有完全理解,调试和修改的话比较困难,所以需要改变思路。
- 参数问题: 先用Matlab的傅立叶变换相关库函数编写自己的同态滤波函数,对图像进行处理,处理过程中发现同态滤波的滤波函数的参数很难找到一组合适的值,达不到设计要求,所以还需改变思路。
- 选择方案: 处理的图像是车牌,所有在网上搜了一下车牌识别的预处理,网上提供的方法主要有直方图均衡化,同态滤波,在小波变换中处理和提取光照分量法等,我先试了一下直方图均衡化感觉是方法不对,达不到效果。同态滤波和小波变换则直接不考虑。为了简单方便我选了最后一种方法,因为它是在空域中滤波,而且对于课堂上学的东西都能用到,不仅可以复习,还可以理论结合实际一举两得。
- MFC做图像处理的若干缺点: 刚拿到题的时候我试图用MFC写一个图像处理的软件,发现有很多问题。
- MFC对图像处理的支持基本为零,需要自己写DIB图像格式的底层接口。
- 写出来的软件只能处理BMP一种图像格式,其它格式的不行。
- 在图像的操作中还存在一个字节对齐的问题。
- 图像是二维的,在MFC中获取图像的像素点时,如果调用库函数效率会特别低,如果用指针通过寻址的方式在一维中找到与二维对应的点。效率虽然高但很容易出错。
- MFC具有很强的数据类型检查,编程中不仅要考虑图像处理的算法还得考虑数据的类型,所有很容易出错。
- MFC中需要自己编写矩阵运算,没有Matlab中那么方便。
对于图像处理MFC并不适合,如果是研究图像处理的算法最好还是用Matlab,因为Matlab也叫矩阵实验室,支持各种各样的图像操作,而且使用还很方便。当然也可以用OpenCV,本人未用过就不介绍了。MFC更适合做普通的Windows软件。
- Matlab GUI编程: 我用MFC写图像处理有点复杂,所以又自学了一下Matlab的GUI编程。并用GUI写了一个图像处理的小软件。
目前主要写了图像处理课本上的前三章,第三章算法已经基本测试能用了,还没加到软件中。第四章的频域部分因为对蝶形运算没有完全理解所以还没写。
彩色图像的HIS模型和RGB模型之间的相互转换算法已经实现,还没有加到软件中。通过写这个小软件收获还是挺多的。- 软件设计过程中考虑最多的不是每一行代码该怎么怎么编写,而是整个软件该如何架构,什么样的架构能提高软件的稳定性,安全性,合理性等。 UI界面该如何设计,能提高软件的易操作性,更美观等等。
- Matlab的GUI编程虽然简单,但是在编程中会有很多的逻辑问题需要考虑,有很多关系都要理清楚。就像一团乱麻一样,需要一根一根的理清楚。
- Matlab的GUI目前只适合做一些小的简单的UI界面,主要更适合于研究方面用以显示数据,或者简单的仿真。对应一些大型的软件好像还是MFC更适合。
- 通过学习Matlab 的GUI编程我发现现在的Matlab可以做一些比较前沿的实验,比如智能算法,机器视觉,无人驾驶,图像识辨,三维重建等等。
- 编程问题: 当代码比较多的时候怎样可以很方便的知道某个文件具体写了一些什么东西,是干嘛用的。除此之外还要考虑的问题很多,
- 代码运行的效率,运行所占用的内存等。
- 编程风格,变量的命名规则,注释,以及代码是否晦涩难懂等。
- 函数的封装,我在写与Matlab的库函数有相同功能的函数时尽可能模仿其调用方式,这有利于练习在Matlab中如何封装自己函数。
- 代码的相关信息,一般在开头,有文件名,作者,日期,概述等,写这些东西是很有必要的。而且在Matlab中有一个最大的好处是 自己封装的函数可以和库函数一样通过帮助查看函数的相关信息,在调用时也有提示。
- 遇到问题如何面对: 在整个设计过程中总是遇到各种各样的问题,在遇到问题的时候首先要做的就是静下心来冷静分析该如何解决问题,而不是一直在心里想着这问题很难,自己很难解决。
每次遇到问题时,问题只有一个,但解决问题的方法有很多,比如这次的设计,去除光照最好是用同态滤波,但自己写快速傅立叶变换比较难,而且滤波函数的参数也不好找。那只能换条思路,在空域中解决。我觉得这一条是比较重要的。 - 学习问题: 对于学习我也不是学霸,在此没有太多的发言权,仅说一下个人观点。
我觉得我们学习的目的不在于考试考了多少多少分,而是学以致用 。学习的目的主要是用,如何将所学到的东西用到实际生活中。
在学这门课程和做设计的时候,我就经常会去思考这门课在我生活的周围环境中的应用,比如现在很多医院,小区,学校的门口都有一个车牌识别的东西,而Matlab现在也可以做一些无人驾驶,计算机视觉,图像三维建模等方面的实验。
还有就是这门课与其它课程的联系 ,比如高数,复变函数,概率论,模电数电,自控,传感器原理,数字信号处理等等。
费曼技巧,就是老师让我们自己上去讲一个东西,要把大家都讲懂。要让大家都懂的前提是自己得完全弄懂,通过这种方式来学习效果是最好的。不仅自己懂了,而且大家也懂了,这也是一种共同学习,共同进步吧。
通过本次的设计,以及课程的学习,真的学到了很多很多,除了课本上的图像处理知识,还有如何解决问题,如何写ppt,如何演讲,如何学习等等。
我是有底线的😎😎😎。。。。。。