« 摄像机标定技术 PART1摄像机标定技术 PART2 »

Image Processing 图像处理程序设计

一. 程序概况

 

程序名称:Xin's Image Processing

 

现版本  .ver 1.72

 

设计环境:WIN32

 

程序功能:完成基本的图像处理基本功能实现

 

设计者  :ZwqXin

 

完成用时:数不清的日夜

 

经历版本:

      .ver 1.0   完成程序构架的设计,主窗口界面布局的设计,完成BMP文件操作类OperateBMP,实现8BIT, 16BIT, 24BIT, 32BIT图片的读入,显示与保存。

 

      .ver 1.10  完成BMP图像处理类BMPFilter的初步设计。以此为虚基类派生各类处理函数,以此反映BMP格式图像处理操作的实质——“Filter”

               完成图像颜色类FilterColor,基于RGB重载各种操作符。

               实现第一个处理功能,空间域模板处理[SpatialDomainTemplate],完成针对各BIT图像的平均模糊,一阶锐化,二阶锐化,和自定义3X3模板处理。

 

      .ver 1.20  建立“点&直方图”处理模块,并完成二值化[ImageBinaryzation],反相[ImageReverseProcess],珈玛变换[ImageGammaProcess],对数变换[ImageLogarithmProcess]等处理功能的实现。

完成图像直方图[ImageHistogram]的创建。

 

      .ver 1.30  完善“点&直方图”处理模块, 完成直方图均衡化[ImageEqualization],图像灰度切割[ImageGrayScaleCutting]等功能。

               完成空间域模板处理中的中值模糊处理,至此完成“模板处理”模块。

               初步涉及DIF – FFT,能初步完成灰度图像的粗略傅立叶变换。

 

      .ver 1.40  着力于完善傅立叶变换[DifFFTProcess]。加入傅立叶变换相关的各种转换设置,加入非2幂考虑,彩色图傅立叶变换,傅立叶反变换等等操作,建立“FFT傅立叶变换”模块。

 

      .ver 1.50  着力于继续完善复杂的傅立叶变换。包括相位谱,彩色图片基于颜色通道[ImageColorApart]的各傅立叶图像。修正了各种BUG。至此完成“FFT傅立叶变换”模块。

               在“点&直方图”处理模块中,加入了图像灰度拉伸的功能实现,并完善与操作者的可视化交互。至此完成“点&直方图”模块。

 

      .ver 1.60  着力于实现基于自定义结构参数的二值图像形态学[MorphologicProcess]处理。建立“形态学运算”模块,实现四种基本形态学运算。

               伴随而实现的是BMP图片的“BIT位数转换”模块,实现高BIT向低BIT的格式转换[FormatBitConvert]

 

       .ver 1.68  尝试实现几种基本图像分割算法,即大津法阈值确定[ImagePartitionOtsu],迭代法阈值确定[ImagePartitionIterator],以及HOUGH直线检测[ImageDetectHough未成功]

                此后,完善“BIT位数转换”模块的同时,实现了RGB空间到HSL空间或HSV空间的互相转换,因而建立了“HSL/HSV空间”功能模块。

 

       .ver 1.72  致力于客户端部分代码的重构,包括半设计模式Factory简单工厂的使用,以及代码重用性封装,一定限度解除WIN32中严重的消息处理部分的冗长和耦合。但待改善的地方还有很多很多,很多很多,很多很多很多很多很多……

       [THX]

博客笔记:
[Bmp文件的结构与基本操作(逐像素印屏版)]
[认识HBITMAP与Bmp操作(整内存拷贝版)]
[基于亮度的图像二值化处理]
[图像处理里的空间域滤波
[点与直方图处理的小结]
[形态学运算小结]
[快速傅立叶变换]
[图像色彩空间与HSL/HSV

本文来源于 ZwqXin (http://www.zwqxin.com/), 转载请注明
      原文地址:http://www.zwqxin.com/archives/Way/image-processing-design-zwqxin.html

二. 设计思路

首先是考虑软件程序的定位。

本程序制作的目的是为了学习和熟悉各种初级图像处理算法,同时期待加强自己的代码编写能力。它是PHOTOSHOP类型的泛型处理程序,而不是应用于实际问题解决方案的针对型处理程序。

 

因此,本程序应该具备以下的特点:

1.       “输入”的覆盖面尽量广

程序的输入为计算机方式表示的图像(目前是微软标准BMP格式的图像),就制作目的来看,程序的输入应该力求涵盖目前世界上普遍使用的所有格式的BMP图像。

具体来说,就是从8BIT的灰度图开始,到8BIT索引图,16BIT增强色图,24BIT真彩色图,32BIT真彩色图。

在程序的各种处理中,除了某些要求必须是针对某种BIT类型而操作的处理(如HSL/HSV转换,不能为灰度图),以及某些因其处理方便性,最好是针对某种BIT类型而操作的处理(如形态学运算,最好是8BIT二值图像),一般会优先考虑其泛适性,即同一操作能应用于各BIT图像。

(注:程序中如果发现哪种操作对某种BIT的图像不起作用,一可能是本身此操作不可能应用于该类BMP,二可能是我还没研究出怎么把该操作作用于它之上。)

我的目的是把图像位数属性抽离出来,仅仅以颜色为对象。当然微软设计BMP格式的时候也没多考虑面向对象的设计方式,因此编程者也不能完全把它们抽象化。但应该更靠近这种程序设计思路,做好必要的封装。

      这种“泛式”应该在第一步考虑输入图像的时候就考虑到,例如输入8位图[带调色板]和输入8位以上位图[不带调色板]的方式就不一样,需要在得到位图信息头里的位数数据决定哪种调入方式。而在程序函数结构方面,就有必要把两种方式都放入同一函数内,以if类语句选择,以保证封装性。最后封入OperateBMP类。

 

2.       “操作”的种类尽量广

除上所说把同一操作应用多种BMP格式外,还应就“操作”来说,尽量包含更多的图像处理操作。也因为面向的是初级图像处理,操作中不会有高级的图像处理技法,但一般来说,简单的操作应该尽量包含(除非自己不认识或不懂算法或实在没时间了),同类的操作应该尽量包含(除非同类的两者中一者明显优于另一者)。

在程序中总共建立了七个功能模块,分别对应“点与直方图”模块,“模板处理”模块,“快速傅立叶”模块,“形态学运算”模块,“图像分割”模块,“位图格式转换”模块和“HSL/HSV空间”模块。其中除了“图像分割”“位图格式转换”模块直接用菜单作为载体(因为基本没参数可调)外,其余都成立了基于对话框的操作载体,实现用户的界面交互。

在具体功能中,可能“图像分割”这块缺得多一点,考虑到提交限期问题。其中除了迭代法求阈值外,其余两者感觉都有算法问题,得不到正确结果,不可不说是本程序的遗憾。

 

3.       基于“基础图像处理”之本质的架构

       高端的算法不懂,所以不妄下断语。但是就目前来看,这类简单图像处理的本质应该是:

Filter 可以泛指操作。也就是原始图像与图像之间的变换函数,在模板处理它是模板,在点处理里它是点映射函数,在形态学处理里它是结构元素和逻辑运算,而在傅立叶变换里,它也就那个FFT算法了。

既然如此,就考虑统一所有的操作。按传统的方法,建立一个虚基类BMPFilter,其他处理类都派生自它。而在客户端,只需要用这个虚基类定义的指针,就可以统治所有处理类了啊。好处是:

1)  分离共性与个性,不混乱而方便管理。

基于相似性而建立的这套规则,能够挖出各种处理中共同的、实质的东西放在基类中,而把特有的部分放在各具体类中。因而代码的修改无论何时都很直接很便捷。在调试中也方便设置断点和找出错误的源头。代码也不冗余。

2)  统一的API,巨大的编码约束力

客户端只要知道各种处理类的名称就够了,实际的要用的函数都是BMPFilter里面定义的那几个函数。各处理类或者直接使用这些函数或者重载它们(实际上无论怎样也得重载其中一个函数)。

这样,整个程序就有统一的API,或者说,统一的命名规范。具体的处理类里没有独特的供外界使用的API,事实上即使有我也可以用RTTI识别,但是我不想这么做而打破这层规范,在编码过程中接受这个规范的约束对整个程序是有利的。

3)  算法设计思路的畅通

具体要实现的功能,设计怎样的算法,这些本来可能让人无从下手的东西,有了这个统一的框架后,思维就容易打通了。该在什么地方放什么东西,理所当然般就知道了。

 

4.       布满学习的痕迹

   由于采用的是WIN32的设计环境,没有MFC那些条条框框,一切都能比较自主。从WIN32主体函数,到资源文件,再到程序任何一个角落的代码,全由自己操办。结合在另一程序中[永远伴随本程序的空工程YRE]设计控件的布局再转入,这种自给自足的编程过程对自己来说是一种尝试和挑战。比起MFC下的编程,这种方式更累,效率更低,用的时间精力更多,但是同时收获的也很多很多。

同样是WIN32环境,因为之前都没怎么接触过。所以学习图像处理的过程中自己也是在学习怎么编写WIN32的程序,例如怎样处理消息、哪种控件应该能发出什么消息怎样设置,如何在子控件上运用GUI画图。甚至自己觉得完成这个程序的一半工夫在图像处理算法的学习上,一半工夫在WIN32的学习上。MFCWIN32的包装,因此要了解微软编程中底层的东西,如消息处理等,WIN32才是最适合的。

 

在类关系设计上,在后期更是加入了一种半设计模式:简单工厂FilterFactory

作用:有效地把WIN32消息响应中的关于BMPFilter的众多类似函数抽离出来,并按需要进行创建。譬如,原来进行一次标准BMP的某种处理,是这样的:

       filter = new 具体类类名;

       filter->SetGraphicEnviroment(NULL, mGHWnd, mGHdc);

       filter->SetFilterType(filterType);

    filter->SendParams(params, paramsNum);

       filter->ConvertImage(bitmap);

       if(filter) delete filter;

 

当这样的代码增多时,就有了代码重复的臭味了。因此使用简单工厂,用一个工厂函数替换。它不仅包括常规的创建,而且包括了上述标准实现步骤。

void FilterFactory::ApplyBMPFilter(FILTER tilter, OperateBMP &bitmap, int filterType,

                                                           bool enGraphic, float *params, int paramsNum)

{

       BMPFilter *filter = NULL;

 

       CreateFilter(filter, tilter);

 

       if(enGraphic)

              filter->SetGraphicEnviroment(NULL, mGHWnd, mGHdc);

 

       filter->SetFilterType(filterType);

       if(params)

       filter->SendParams(params, paramsNum);

 

       filter->ConvertImage(bitmap);

       if(filter) delete filter;

 

}

其中,CreateFilter函数根据具体类类名的别名tilter,创建(new)一个对象出来。

 程序简单UML – 类结构图

 

注:最顶端结构是客户端,包括所有类的出口WINMAIN,以及响应程序一切操作的消息处理函数,以及其余辅助函数等等。

主窗口以及对话框都有各自的消息处理函数,对话框中,“点&直方图”模块的对话框和“形态学运算”模块的对话框都有GDI显示区域,也拥有其自身的子类化的消息处理函数。其层次关系是:

                             WindowProc

                                

FILTER FILTERSET HISTOGRAM FOURIER MORPHOLOGIC HSLHSV

                                

                   SUBGPROC SUBMOPROC

    CLIENT下来有两路。

1)其下的结构是处理类工厂FilterFactory,担当饭堂窗口的打菜阿姨的职责。

再其下的结构是抽象处理类BMPFilter,是所有饭菜的总称,即“饭菜” - -

再其下的结构是各种具体的处理类,是各种各样的名为XX的菜式。

2)客户端同时需要的,就是OperateBMP类喇,它维护着整张图片和相关行为操作,它也就是“我们”——打菜要饭的饿孩。

 

客户端让FilterFactoryBMPFilter来服务OperateBMP,构成整个买饭过程(My程序)。

三. 功能描述

1.       主界面



 

2.       各模块对话框设计

1)  模板处理[fILTER]

2)  .直方图[hIstoGram]

3)  快速傅立叶[foUrier]

 

 

4)  形态学运算[mOrphOlOgic]

 

5)  HSL/HSV空间[hSL]

[文档以下部分从略]

3.3  图片的打开保存,测试图

3.4  图像二值化[ImageBinaryzation]

3.5  图像反相[ImageReverseProcess]

3.6  变换[ImageGammaProcess]

3.7  对数变换[ImageLogarithmProcess]

3.8  直方图均衡化[ImageEqualization]

3.9  灰度切割[ImageGrayScaleCutting]

3.10灰度拉伸[ImageGrayStretching]

3.11模板处理[SpatialDomainTemplate]

3.12快速傅立叶变换[DifFFTProcess]

3.13形态学运算[MorphologicProcess]

3.14图像分割-迭代法求阈值[ImagePartitionIterator]

3.15 图像分割-大津法求阈值[ImagePartitionOtsu]

3.16图像分割- HOUGH取长直线[ImageDetectHough]

3.17 BIT格式转换 [FormatBitConvert]

3.18 HSL/HSV空间 [FormatHSLConvert & FormatHSVConvert]

3.19辅助处理类 分量分割[ImageColorApart]

3.20辅助处理类 直方图[ImageHistogram]

 

附:程序Read Me文档:

     1) 程序执行文件,不需经得责任人同意即可随意传播;

     2) 程序代码,谢绝用于一切 学习用途 商业用途。

[完.  截自我的图像处理课程设计.文档]

Xin's Image Processing .ver 1.72 
Release:ImageProcess.BYZwqXin.rar

本文来源于 ZwqXin (http://www.zwqxin.com/), 转载请注明
      原文地址:http://www.zwqxin.com/archives/Way/image-processing-design-zwqxin.html

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

IE下本页面显示有问题?

→点击地址栏右侧【兼容视图】←

日历

Search

网站分类

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Walle Build 100427

Copyright 2008-2013 ZwqXin. All Rights Reserved. Theme edited from ipati.