VcImgProc 小插曲:什么是最重要的?

来源:互联网 时间:1970-01-01

在完成博文《Win7 下 Vc 6.0平台搭建》后的这几天,我没有继续发表系列博文,而是按照《开篇》所确定的学习流程,纠结于盘根错节般的 MFC 底层源代码中。

人遇到障碍,难免会生出一丝逃避障碍的念头。有一种的障碍,是你必须得经历的过程,跨过去则 “柳暗花明又一村”,会见到更加壮阔的景色。跨不过去,则叫做“徒畏浮云遮望眼”,水平只会停滞不前。对于这种障碍,“逃避”是一种学习毅力不坚强的表现;但也有一种障碍,则是错误的选择、错误的策略所造成的,对于这种障碍,“逃避”反而会带来益处,促使你重新审视前路,做出正确的调整。因此,当我在学习的过程中遇到非常非常难啃的硬骨头的时候,总会抽个时间,分析一下这种障碍到底属于上面二者的哪一种。

那么,在本系列博文中(这个前提非常重要),MFC(Microsoft Foundation Classes) 究竟是怎样的地位?

我浏览了一下张铮的《数字图先处理与机器视觉》(这本书是本系列博文的主要参考书之一),发现 MFC 在其中扮演的角色更多是 “算法的展示” 而非 “算法的实现”。什么是算法的展示?意思就是说使用 C++ 实现了算法后,接下来我们就会让它在特定的 GUI 平台上运行。在这里我们使用了MFC,当然不是非得用 MFC,你也可以使用比如 Qt、WxWindows 等一些其他的 C++ GUI 库。因此,“算法的实现” 和 “算法的展示” 是分离的,算法是 “灵魂”,而特定的 GUI 库则是容纳 “灵魂” 的 “躯体”。只要灵魂不灭,就可以施展青帝灵感仰的 “种神大法” 更换 “躯体” 了(嘿嘿,引一下树下野狐《蛮荒记》~)。

如此看来,在使用 C++ 实现图像处理算法时,MFC 并非处于最核心的地位,当然也就并不算是本系列博文的核心关注点了。这就自然而然引发一个问题,什么是最重要的?换一句话说,什么是本系列博文的核心内容?我所理解的 “核心内容” ,就必须具有较高的保值性和通用性,掌握之后能在各个特定环境中应用自如。

想来想去,我确定了如下几点:

  • 图像处理算法的原理
    说到算法的原理,更偏向于一种数学上的、通用性的、抽象性的描述。与使用何种平台、工具、语言 无关。 
  • 图像处理算法的计算机语言实现
    这一步相当于把数学原理、公式 “翻译” 成计算机语言,在算法和语言之间建立一个桥梁。这个层次中的“语言”仅代表一般性的语言概念,不应过多涉及某种语言的独有特性(比如C++的模板编程等),而是更多地使用语言的通用术语。有了这一环节的分析,以后如果需要使用其他语言实现此算法(如C#、Java),就会更加容易。
  • 图像处理算法的 C++ 实现
    OK,终于到某种特定的语言了。C++ 是我认为的实现实现图像处理算法的最佳语言之一,因其速度快、功能强大、可移植性性好等优点。如何使用 C++ 实现特定算法,自然也是本系列博文所关注的核心点之一。

基于所有上面的考虑,我打算对本系列博文的安排(也可说是我的学习策略)做一些调整,调整的原则有两条:

  • 突出核心
    突出上面所提到的三条核心内容,减少对 MFC 底层实现原理的介绍。
  • 自底向下 -> 自顶向上
    提前介绍 Demo,以案例为导向,这样可以更快地进入主题,增强学习的动力;而把 MFC 的实现放到最后。

下面是根据上述原则所做的调整 :

  • Introduction of 灰度阈值变换算法 Demo —— “纯粹的线条”
    通过某个具体的情景引入本系列博文唯一的也是非常简单的 Demo —— “纯粹的线条”,并介绍所涉及的算法 —— 灰度阈值变换 —— 的原理。
  • CImg 和 CImgProc —— 图像操作和处理类
    只懂原理可不行,还得要用 C++ 实现呢~ 本文介绍了两个基本类 CImg 和 CImgProc 的设计,前者封装了图像的必要数据结构(如信息结构体、图像数据等)和一些必要的成员函数(如读取、保存图像,设置某点像素等);后者则负责封装特定的图像处理算法。 
  • Demo 的实现 —— 基于 MFC
    在以上两篇博文的基础之上,我们再来介绍如何使用 MFC 实现 Demo,仅涉及必要的 MFC 知识,包括 文档/视图 结构,以及对话框、菜单的实现。

上面所提到的改变,并未反映在博文《开篇》中,因为我想把这种思想的转变完完整整地保留在系列博文中(呵呵,有点像保留 “证据” 的感觉)。

“学而不思则罔,思维不学则殆”,学习是一个漫长的求索过程,不仅要付出实际行动,而且同时也要不断地思考,不断调整学习的方向。以后,难免还会出现类似的调整,那就以 “VcImgProc 小插曲” 的形式穿插在系列博文之间吧!

方向既然已经明确,付诸行动的时候到了,敬请期待系列博文之:

swicth ( VcImageProc ) case 2:Introduction of 灰度阈值变换 Demo —— “纯粹的线条”
 

P.S. 经历了这次思考,我发现我的一个缺点就是,在借用某种工具实现某个目标时,过于关注工具,反而慢慢遗忘了原始的目标。就像人赚钱是为了享受人生,但后来人生的目标却在不知不觉中变成纯粹的赚钱了。切记切记啊,以后发生这种情况时一定要注意及时调整!

绿色通道:好文要顶关注我收藏该文与我联系


相关阅读:
Top