前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >图形图像算法中必须要了解的设计模式(1)

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

作者头像
OpenCV学堂
发布于 2018-07-26 02:48:57
发布于 2018-07-26 02:48:57
1.5K80
代码可运行
举报
运行总次数:0
代码可运行

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

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

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

  1. 写的算法很难通用于所有的数据类型!每来一个新类型的数据,又得改一下算法,或新加一个方法来支持这种类型。
  2. 有时候多个算法需要灵活组合,甚至每个算法的顺序不一样都会产生不一样的效果;每一种组合都要为其构建一个新算法,即累又麻烦。
  3. 算法越来越多,自建的算法库也越来越庞大而难于管理;

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

装饰模式

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

  • 装饰模式可以动态地给一个对象附加更多的功能。
  • 用不同的算法作为装饰器进行多重装饰,可以达到不同算法的灵活组合;装饰的顺序不同,可能产生不同的效果。

应用案例

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

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

  1. 将图像规格化(将所有图片缩放到 800*600)
  2. 平滑去噪处理
  3. 图像的灰度化
  4. 图像的梯度化
  5. 图像的二值化
  6. 真正的识别处理,进行ORI区域识别。

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def imageProcessing1():
    print("算法逻辑")
    # todo Something

def imageProcessing2():
    print("算法逻辑")
    # todo Something

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resultImg1 = GrayProcessor(GradientProcessor(EdgeExtractionProcessor())).processing(img)
resultImg2 = GradientProcessor(GrayProcessor(EdgeExtractionProcessor())).processing(img)

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

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

灰度化:

梯度化:

边缘提取

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

梯度化:

灰度化:

边缘提取:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from abc import ABCMeta, abstractmethod
# 引入ABCMeta和abstractmethod来定义抽象类和抽象方法

class ImageProcessor(metaclass=ABCMeta):
    "图像处理的接口类"

    @abstractmethod
    def processing(self, img):
        "图像处理的抽象方法"
        pass

class EdgeExtractionProcessor(ImageProcessor):
    "边缘提取算法"

    def processing(self, img):
        super().processing(img)
        print("真正的核心算法:边缘提取算法")
        newImg = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 10)
        return newImg


class ImageDecorator(ImageProcessor):
    "图像装饰器"

    def __init__(self, processor):
        self._decorator = processor

    def processing(self, img):
        tmpImg = self.preProcessing(img)
        return self._decorator.processing(tmpImg)

    @abstractmethod
    def preProcessing(self, img):
        "预处理方法,由子类实现"
        pass


class GrayProcessor(ImageDecorator):
    "灰度化处理器"

    def __init__(self, processor):
        super().__init__(processor)

    def preProcessing(self, img):
        print("灰度化处理...")
        return cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换了灰度化


class GradientProcessor(ImageDecorator):
    "梯度化处理器"

    def __init__(self, processor):
        super().__init__(processor)

    def preProcessing(self, img):
        print("梯度化处理...")
        x = cv2.Sobel(img, cv2.CV_16S, 1, 0)
        y = cv2.Sobel(img, cv2.CV_16S, 0, 1)
        absX = cv2.convertScaleAbs(x)  # 转回uint8
        absY = cv2.convertScaleAbs(y)
        return cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

测试代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def testImageProcessing():
    img = cv2.imread("E:\\TestImages\\bird.jpg")
    print("灰度化 --> 梯度化 --> 核心算法:边缘提取算法:")
    resultImg1 = GrayProcessor(GradientProcessor(EdgeExtractionProcessor())).processing(img)
    print()

    print("梯度化 --> 灰度化 --> 核心算法:边缘提取算法:")
    resultImg2 = GradientProcessor(GrayProcessor(EdgeExtractionProcessor())).processing(img)
    print()

    cv2.imshow("The result of image process1", resultImg1)
    cv2.imshow("The result of image process2", resultImg2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
灰度化 --> 梯度化 --> 核心算法:边缘提取算法:
灰度化处理...
梯度化处理...
真正的核心算法:边缘提取算法

梯度化 --> 灰度化 --> 核心算法:边缘提取算法:
梯度化处理...
灰度化处理...
真正的核心算法:边缘提取算法

Get到技能点了吗?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
8 条评论
热度
最新
你好!可以转载文章到其他平台吗?仅供学习
你好!可以转载文章到其他平台吗?仅供学习
44点赞举报
哪个平台?
哪个平台?
回复回复点赞举报
知乎,自己从事机械研发工作的,感觉很有用,想让同行一起学习
知乎,自己从事机械研发工作的,感觉很有用,想让同行一起学习
回复回复点赞举报
查看全部4条回复
机器人灵巧手
机器人灵巧手
22点赞举报
有灵巧手最新进展吗?
有灵巧手最新进展吗?
回复回复点赞举报
肯定有,暂时没有更新,后期持续推进
肯定有,暂时没有更新,后期持续推进
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
图形图像算法中必须要了解的设计模式(3)
随着信息的多元化,信息的概念不仅仅指的是文字,它还包含图片、声音、视频等其它丰富的信息。文字信息越来越多地被图片、声音、视频信息所替代,而视频又是由一针一针的图像组成的,因此图形图像的处理变得越来越热门和重要,众多的专家、学者、工程师投入到这个领域。
OpenCV学堂
2019/11/13
6770
图形图像算法中必须要了解的设计模式(2)
AI越来越火热,人工智能已然成风!而人工智能最重要是各种算法,因此机器学习越来越受到追捧,算法越来越被重视。
OpenCV学堂
2018/07/26
4810
挑战任务: 车道检测
本次挑战内容来自Udacity自动驾驶纳米学位课程,素材中车道保持不变,车道线清晰明确,易于检测,是车道检测的基础版本,网上也有很多针对复杂场景的高级实现,感兴趣的童鞋可以自行了解。
CodecWang
2021/12/07
5210
挑战任务: 车道检测
[图像处理] Python+OpenCV实现车牌区域识别
这里原理推荐我以前C++图像处理的文章,如下:https://blog.csdn.net/column/details/eastmount-mfc.html
统计学家
2019/04/23
4.7K0
[图像处理] Python+OpenCV实现车牌区域识别
[Python图像处理] 十七.图像锐化与边缘检测之Roberts、Prewitt、Sobel和Laplacian算子
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~
Eastmount
2023/02/28
2.7K0
[Python图像处理] 十七.图像锐化与边缘检测之Roberts、Prewitt、Sobel和Laplacian算子
设计模式了解哪些,模版模式
模版模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤延迟到子类中。模版模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。
GeekLiHua
2025/01/21
1110
[Python图像处理] 十六.图像的灰度非线性变换之对数变换、伽马变换
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~
Eastmount
2023/02/28
1.2K0
[Python图像处理] 十六.图像的灰度非线性变换之对数变换、伽马变换
[Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~
Eastmount
2023/09/01
7990
[Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子
【计算机视觉】【图像处理综合应用】路沿检测
用python的OpenCV实现视频文件的处理,用videoCapture打开视频文件,读取每一帧进行处理,然后用videoWriter保存成视频。
叶茂林
2023/11/27
4650
【计算机视觉】【图像处理综合应用】路沿检测
修正!【从零学习OpenCV 4】分割图像——分水岭法
分水岭算法与漫水填充法相似,都是模拟水淹过山地的场景,区别是漫水填充法是从局部某个像素值进行分割,是一种局部分割算法,而分水岭法是从全局出发,需要对全局都进行分割。
小白学视觉
2020/02/27
1.6K0
OpenCV图像处理笔记(二):图片操作进阶
一、图像模糊 1、模糊原理 Smooth/Blur 是图像处理中最简单和常用的操作之一 使用该操作的原因之一就为了给图像预处理时候减低噪声 使用Smooth/Blur操作其背后是数学的卷积计算 通常这
MiChong
2020/09/24
1.2K0
OpenCV图像处理笔记(二):图片操作进阶
OpenCV学习+常用函数记录③:霍夫变换与轮廓提取
OpenCV 霍夫变换与轮廓提取 3. 霍夫变换 3.1 霍夫直线 3.2 霍夫圆 4. 轮廓提取 4.1 查找轮廓 4.2 绘制轮廓 3. 霍夫变换 首先放上霍夫变换官方文档:[霍夫直线变换官网文档] 3.1 霍夫直线 import cv2 as cv import matplotlib.pyplot as plt import numpy as np # 1. 将图片以灰度的方式读取进来 img = cv.imread("../img/weiqi.jpg", cv.IMREAD_COLOR) gr
小黑鸭
2020/11/24
9930
【说站】python中Laplacian算子是什么
1、Laplacian算子是n维欧几里德空间的二阶微分算子,常用于图像增强领域和边缘提取。
很酷的站长
2022/11/23
2810
【说站】python中Laplacian算子是什么
【OpenCV图像处理基础与OCR应用】
在现代计算机视觉中,OpenCV是一款非常流行且强大的工具库。它不仅支持基本的图像处理操作,还能与深度学习模型结合应用,解决实际问题。OCR(光学字符识别)是计算机视觉中的一个重要应用领域,广泛用于文档扫描、车牌识别、手写识别等。本文将带你从基础的图像处理开始,逐步了解OCR技术的原理,并结合OpenCV实现简单的OCR预处理流程。
机器学习司猫白
2025/03/09
1920
[Python图像处理] 七.图像阈值化处理及民族服饰实验对比
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类、目标检测应用。
Eastmount
2021/12/02
6470
[Python图像处理] 七.图像阈值化处理及民族服饰实验对比
OpenCV与图像处理(二)
以下代码均在python3.6,opencv4.2.0环境下试了跑一遍,可直接运行。
Must
2020/07/28
6970
OpenCV与图像处理(二)
万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文
期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~
全栈程序员站长
2022/11/04
2.1K0
万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文
Python算法解析:图像处理算法的魔法与实现技巧!
图像处理算法是应用于数字图像的一系列技术和方法,旨在改善图像的质量、提取图像中的信息或实现特定的图像处理任务。图像处理算法在计算机视觉、图像识别、医学影像、计算摄影等领域具有广泛的应用。
测试开发囤货
2023/08/08
3490
Python算法解析:图像处理算法的魔法与实现技巧!
Python opencv图像处理基础总结(五) 图像金字塔 图像梯度 Canny算法边缘提取
图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效且概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低
叶庭云
2022/05/09
7170
Python opencv图像处理基础总结(五) 图像金字塔 图像梯度 Canny算法边缘提取
OpenCV与图像处理(五)
以下代码均在python3.6,opencv4.2.0环境下试了跑一遍,可直接运行。
Must
2020/07/28
7200
OpenCV与图像处理(五)
推荐阅读
相关推荐
图形图像算法中必须要了解的设计模式(3)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验