首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行图像分割

并行图像分割
EN

Code Review用户
提问于 2020-07-03 05:42:04
回答 1查看 109关注 0票数 1

跟进问题利用Python库进行图像处理

我想使用多处理并行分析几个图像:

代码语言:javascript
复制
class SegmentationType(object):
    DISPLAY_NAME = "invalid"

    def __init__(self, filename, path):
        self.filename = filename
        self.path = path
        self.input_data = None
        self.output_data = None


    def read_image(self):
        self.input_data =  cv2.imread(self.path + self.filename)[1]

    def write_image(self):
        cv2.imwrite(self.path + self.filename.split('.')[0] + '_' + self.DISPLAY_NAME + '.png', self.output_data)

    def process(self):
        # override in derived classes to perform an actual segmentation
        pass

    def start_pipeline(self):
        self.read_image()
        self.process()
        self.write_image()

class HSV_Segmenter(SegmentationType):
    DISPLAY_NAME = 'HSV'

    def process(self):
        source = rgb_to_hsv(self.input_data)
        self.output_data = treshold_otsu(source)


class LabSegmenter(SegmentationType):
    DISPLAY_NAME = 'LAB'

    def process(self):
        source = rgb_to_lab(self.input_data)
        self.output_data = global_threshold(source)


segmenter_class = {
'hsv': HSV_Segmentation,
'lab': LAB_Segmenter
}.get(procedure)

if not segmenter_class:
    raise ArgumentError("Invalid segmentation method '{}'".format(procedure))

for img in images:
    os.chdir(img_dir)
    processor =  = segmenter_class(img, img_dir, procedure)
    processor.start_pipeline()

到目前为止我尝试过的是:

代码语言:javascript
复制
image_lst = os.listdir(my_image_path)

# We split the list into sublist with 5 elements because of 512 GB RAM limitation
if len(image_lst) > 4:
    nr_of_sublists = (int(len(image_lst)/2.5))
    image_sub_lst  =(np.array_split(image_lst, nr_of_sublists))
else:
    image_sub_lst = [image_lst]

# We do the analysis for each sublist
for sub_lst in image_sub_lst:
    print (sub_lst)
    pool = multiprocessing.Pool(8)
    
    # Call the processor 
    processor =  = segmenter_class(img, img_dir, procedure)
    processor.start_pipeline()
    # How to call map???
    pool.map(?, sub_lst)
    pool.terminate()
EN

回答 1

Code Review用户

发布于 2020-07-05 18:57:33

--对

版本的警告

下面的许多建议假设您使用的是Python 3。

裸继承

代码语言:javascript
复制
class SegmentationType(object):

可以是

代码语言:javascript
复制
class SegmentationType:

抽象静力学

代码语言:javascript
复制
DISPLAY_NAME = "invalid"

不应该真正分配一个值。相反,

代码语言:javascript
复制
DISPLAY_NAME: str

解包装imread

文献资料非常无助:它说imread返回"retval“。考虑到您的用法,很明显现实更加复杂,因为您正在对其进行索引。试着拆开包装:

代码语言:javascript
复制
_, self.input_data = cv2.imread(self.path + self.filename)

抽象方法

process应该raise NotImplementedError在基础上。

工厂

您有一个工厂字典,应该转换成一个方法,如下所示

代码语言:javascript
复制
def get_segmenter(name: str) -> Type[SegmentationType]:
    return {
        t.DISPLAY_NAME: t
        for t in (HSVSegmenter, LABSegmenter)
    }[name]

外括号

这两种情况都没有:

代码语言:javascript
复制
nr_of_sublists = (int(len(image_lst)/2.5))
image_sub_lst  =(np.array_split(image_lst, nr_of_sublists))

需要外括号。

语法

这肯定是打错了?这将不会运行:

代码语言:javascript
复制
processor =  = segmenter_class(img, img_dir, procedure)

这一点也不会:

代码语言:javascript
复制
pool.map(?, sub_lst)
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/244920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档