图形图像算法中必须要了解的设计模式(1)

图形图像算法中必须要了解的设计模式(1)

随着信息的多元化,信息的概念不仅仅指的是文字,它还包含图片、声音、视频等其它丰富的信息。文字信息越来越多地被图片、声音、视频信息所替代,而视频又是由一针一针的图像组成的,因此图形图像的处理变得越来越热门和重要,众多的专家、学者、工程师投入到这个领域。

作为一个图像算法的研究者,写出一手高级算法当然是令人兴奋的一件事!但你是否有时会有这种感觉:

写的算法很难通用于所有的数据类型!每来一个新类型的数据,又得改一下算法,或新加一个方法来支持这种类型。

有时候多个算法需要灵活组合,甚至每个算法的顺序不一样都会产生不一样的效果;每一种组合都要为其构建一个新算法,即累又麻烦。

算法越来越多,自建的算法库也越来越庞大而难于管理;

这个时候,让你的算法具有更好通用性、拓展性就显得极为重要!因此,你必须要掌握几个重要的设计模式来解决这些问题。今天介绍其中一个最重要的设计模式——装饰模式

装饰模式

装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。

装饰模式可以动态地给一个对象附加更多的功能。

用不同的算法作为装饰器进行多重装饰,可以达到不同算法的灵活组合;装饰的顺序不同,可能产生不同的效果。

应用案例

静态图像其实就是一个二维的像素数组,对图像的处理其实就是对一个二维坐标像素数据的处理。在图像处理中,图像的灰度化、梯度化(锐化)、边缘化、二值化都是图像处理的基本算法,在进行真正的核心算法之前,经常需要进行这些预处理。

如我曾经在开发的一个用于医疗影像领域的细胞检测和识别项目时,就用到这样的一些处理过程:

将图像规格化(将所有图片缩放到 800*600)

平滑去噪处理

图像的灰度化

图像的梯度化

图像的二值化

真正的识别处理,进行ORI区域识别。

这些预处理算法的顺序不同,将对结果产生很大的影响。

下面我们将以图像的边缘提取算法为例演示整个处理过程,为简单起见,假设有两个预处理过程(灰度化、梯度化)和一个核心算法(二值化边缘提取)。有两种处理顺序,分别如下:

灰度化 --> 梯度化 --> 核心算法:边缘提取算法:

梯度化 --> 灰度化 --> 核心算法:边缘提取算法:

如果你来实现,代码会怎么实现呢?... ... 也许你会说那还不简单!立马就能想到针对两个处理顺序分别写两个方法:

那问题来了,如果预处理的过程不止2种,而是有5种;那就会有5! = 120种排列,难道你要写120个方法?想想都可怕!

如果你用装饰模式,那上面这个问题只要两行代码就能搞定:

两种处理顺序的图片预览效果如下:原图

处理顺序1:灰度化 --> 梯度化 --> 核心算法:边缘提取算法

灰度化:

梯度化:

边缘提取

处理顺序2:梯度化 --> 灰度化 --> 核心算法:边缘提取算法

梯度化:

灰度化:

边缘提取:

这里两种不同的预处理顺序,结果是有略微不同的。想知道我是如何将这个代码精简到两行的吗?这都得归功于装饰模式,下面就一起看看装饰模式的实现方式吧!(下面这段代码用OpenCv for Python实现,Python 3.6.3,opencv-3.4.1,numpy-1.14.5)

测试代码如下:

结果如下:

Get到技能点了吗?

想了解更多更详细的信息,或想学习更多其他设计模式,请扫描下方图中二维码!下一篇将继续讲解《图形图像算法中必须要了解的设计模式(2)》。

《从生活中领悟设计模式(Python)》适合具有一定编程基础又渴望提升自己编程技能的人,此课程如果武功秘籍一般力求用最通俗的语言阐述最难懂的概念;用最简单的语法实现最复杂的逻辑;用最短小的代码写出最强悍的程序!

此课程分三卷内容:

第一卷:基础篇(第01~21课),19 种常用设计模式单独章节讲解 + 剩余 4 种模式合集(会有1~2篇的篇幅);

第二卷:进阶篇(第22~24课),是基础设计模式的衍生,也是各大编程语言中非常重要而常见的种编程机制;

第三卷:经验篇(第25~27课),将会分享我对设计原则、设计模式、项目重构的经验和看法。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180702G0BXNH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券