用责任链模式实现图像处理方法的选择（python）

设计思路：

# coding=utf-8
from enum import Enum

class ProcCodeEnum(Enum):
# 图像平滑
GAUSSIAN_BLUR = '101'
MEAN_BLUR = '102'
MEDIA_BLUR = '103'
B_F_BLUR = '104'
JOINT_B_F_BLUR = '105'

# 阈值分割
AUTO_THRESHOLD = '201'
MANUAL_THRESHOLD = '202'

# 轮廓提取
ACCURATE_CONTOUR = '301'
FITTING_CONTOUR = '302'

# 角点提取
HARRIS_CORNER = '401'
SUBPIX_CORNER = '402'
R_J_CORNER = '403'

# 形态学处理
ERODE = '501'
DILATE = '502'
MORPH_OPERATIONS_CAL = '503'

• 免掉很多if else语句。
• 扩展时候容易，只需要以同样模式新增代码就好，不需要改动已有逻辑。

• 随着图像处理算法的增加，manager的负担太大，虽然他不需要进行具体处理，但是他没接到一个任务需要挨家挨户敲门去问手下的工人能不能进行处理，显然不是很好。

详细设计：

handler.py

class Handler(object):

def __init__(self, _to_next=None):
self._to_next = _to_next

def to_next(self, _to_next):
self._to_next = _to_next

def handle(self, code, params, image):
pass

import cv2

from img_algorithms.algorithms_base import Handler
from img_algorithms.algorithms_base import get_border_type
from myenums.proc_code_enum import ProcCodeEnum

def gaussian_blur(image, k_size_w, k_size_h, sigma_x, sigma_y, border_type):
return cv2.GaussianBlur(image,
ksize=(k_size_w, k_size_h),
sigmaX=sigma_x,
sigmaY=sigma_y,
borderType=get_border_type(border_type))

# 继承Handle，如果自己能处理，则处理，处理不了，则交给下一个（调用to_next的handle）
class GaussianBlurHandler(Handler):
def handle(self, code, params, image):
if code == ProcCodeEnum.GAUSSIAN_BLUR:
return gaussian_blur(image,
int(params['kSizeW']),
int(params['kSizeH']),
float(params['sigmaX']),
float(params['sigmaY']),
int(params['borderType']))
else:
return self._to_next.handle(code, params, image)

# coding=utf-8
from img_algorithms.algorithms_base import Handler

class NoProcHandler(Handler):
def handle(self, code, params, image):
raise Exception('哎呀～{}号图像处理方法尚未完成，请静候佳音'.format(code))

from img_algorithms.algorithms_base import NoProcHandler
from img_algorithms.algorithms_smooth import BFBlurHandler
from img_algorithms.algorithms_smooth import GaussianBlurHandler
from img_algorithms.algorithms_smooth import JointBFBlurHandler
from img_algorithms.algorithms_smooth import MeanBlurHandler
from img_algorithms.algorithms_smooth import MediaBlurHandler

def process(code, params, image):
# 实例化每个小算法
gaussian_blur = GaussianBlurHandler()
mean_blur = MeanBlurHandler()
media_blur = MediaBlurHandler()
b_f_blur = BFBlurHandler()
joint_b_f_blur = JointBFBlurHandler()
no_proc_handler = NoProcHandler()
# 拼成链条
gaussian_blur.to_next(mean_blur)
mean_blur.to_next(media_blur)
media_blur.to_next(b_f_blur)
b_f_blur.to_next(joint_b_f_blur)
joint_b_f_blur.to_next(no_proc_handler)

return gaussian_blur.handle(code, params, image)

...
if int(o_code) < 200:
processed_img_arr = smooth_manager.process(o_code, o_params, img_arr)
...

##PR新增算法

新增图像处理大类

1. 在proc_code_enum.py中添加大类以及code，注释与命名风格请一定统一。
2. 在img_algorithms中新建大类的package，并在img_algorithms的__init__.py文件中import manager。
3. 在新建的package中写用责任链模式写新的小类算法。
4. 在img_lab.py的判断code中，调用新类manager的process方法，注意，这里读入的图都是彩色BGR图，如需要灰度图，请在算法中自行转换。

新增图像处理小类

1. 在proc_code_enum.py中添加小类code，注释与命名风格请一定统一。
2. 从img_algorithms中找到大类，在里面新建小类模块，并在大类的__init__.py中import 方法。

数据库添加

{
"name" : "形态学运算",
"code" : "503",
"type" : [
{
"name" : "形态学处理"
}
],
"params" : [
{
"type" : "input",
"name" : "结构元大小",
"value" : [],
"limit" : "odd",
"pName" : "kSize"
},
{
"type" : "select",
"name" : "结构元形状",
"value" : [
"矩形",
"椭圆形",
"十字交叉形"
],
"limit" : "",
"pName" : "shape"
},
{
"type" : "input",
"name" : "迭代次数",
"value" : [],
"limit" : "int >0",
"pName" : "iterations"
},
{
"type" : "select",
"name" : "运算",
"value" : [
"开运算",
"闭运算",
"形态梯度",
"顶帽运算",
"底帽运算"
],
"valueDesc" : [
"先腐蚀再膨胀，可以消除白色小物体",
"先膨胀再腐蚀，可以消除黑色小物体",
"膨胀图与腐蚀图之差，对二值图可以出现中空效果，类似华文彩云字体",
"原图像与开运算做差，可以用来分离比邻近点亮的斑块",
"原图像和闭运算做差，可以用来分离比邻近点暗的斑块"
],
"limit" : "",
"pName" : "op"
},
{
"type" : "select",
"name" : "边界扩充方式",
"value" : [
"边界复制",
"常数扩充",
"反射扩充",
"边界为中心反射扩充",
"平铺扩充"
],
"valueDesc" : [
"边界复制：BORDER_REPLICATE，复制最外围像素实现扩充",
"常数扩充：BORDER_CONSTANT，用指定常数扩充边界，这里全部用0扩充",
"反射扩充：BORDER_REFLECT，对图片进行镜像扩充",
"边界为中心反射扩充：BORDER_REFLECT_101，以四个边界分别为对称轴镜像扩充，比反括扩充少了一圈边界值的复制",
"平铺扩充：BORDER_WRAP，同桌面平铺效果"
],
"limit" : "",
"pName" : "borderType"
}
]
}

0 条评论

相关文章

转录因子详细介绍(motif)

TF: transcription factor转录因子 TFBS: transcription factor binding site转录因子结合位点 T...

1.2K30

机器人A*寻路算法详解

A*（A-star）算法是一种静态网路中求解最短路径最有效的直接搜索算法。在电子游戏中最主要的应用是寻找地图上两点间的最佳路线。在机器人领域中，A*算法...

43240

29450

31490

13520

12630

18230

19630

1K40

Noip 2016 Day1 题解

597120
{"ft_lang_label":"__label__zh","ft_lang_prob":0.53359705,"math_prob":0.9353383,"size":5396,"snap":"2019-43-2019-47","text_gpt3_token_len":2835,"char_repetition_ratio":0.13724035,"word_repetition_ratio":0.057831325,"special_character_ratio":0.26464048,"punctuation_ratio":0.25905293,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.9645198,"pos_list":[0,1,2],"im_url_duplicate_count":[null,null,null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2019-10-24T04:33:53Z\",\"WARC-Record-ID\":\"<urn:uuid:14832502-a3f9-47fe-a382-c13a23054293>\",\"Content-Length\":\"102163\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:f7c0f5f5-0ca3-4b70-a2a4-2a5994218f09>\",\"WARC-Concurrent-To\":\"<urn:uuid:64ae23b7-00b4-4a86-8bdf-c9b06657af13>\",\"WARC-IP-Address\":\"119.28.39.127\",\"WARC-Target-URI\":\"https://cloud.tencent.com/developer/article/1366885\",\"WARC-Payload-Digest\":\"sha1:5OQIDNSU5N5ZYXP4D6JPOA3PX56ED7UU\",\"WARC-Block-Digest\":\"sha1:HVBIAB7TNZ7TL72XEEM464N7PT63ZSJ5\",\"WARC-Identified-Payload-Type\":\"text/html\",\"warc_filename\":\"/cc_download/warc_2019/CC-MAIN-2019-43/CC-MAIN-2019-43_segments_1570987841291.79_warc_CC-MAIN-20191024040131-20191024063631-00357.warc.gz\"}"}