注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

易拉罐的博客

心静自然凉

 
 
 

日志

 
 

转 Image Processing 图像处理程序设计  

2010-04-08 22:47:10|  分类: 机器视觉 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


一. 程序概况
 
程序名称:Xin's Image Processing
 
现版本  : .ver 1.72
 
设计环境:WIN32
 
程序功能:完成基本的图像处理基本功能实现
 
设计者  :何宝新
 
完成用时:数不清的日夜
 
经历版本:
      .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中严重的消息处理部分的冗长和耦合。但待改善的地方还有很多很多,很多很多,很多很多很多很多很多……


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


二. 设计思路
首先是考虑软件程序的定位。
本程序制作的目的是为了学习和熟悉各种初级图像处理算法,同时期待加强自己的代码编写能力。它是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的学习上。MFC是WIN32的包装,因此要了解微软编程中底层的东西,如消息处理等,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类喇,它维护着整张图片和相关行为操作,它也就是“我们”——打菜要饭的饿孩。
 
客户端让FilterFactory拿BMPFilter来服务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]

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

  评论这张
 
阅读(427)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017