图形图像算法中必须要了解的设计模式(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课),将会分享我对设计原则、设计模式、项目重构的经验和看法。
领取专属 10元无门槛券
私享最新 技术干货