【问题标题】:Python PIL paralellism(parallel map)Python PIL 并行(并行映射)
【发布时间】:2018-01-16 18:39:44
【问题描述】:

我想用 PIL 打开一个图像并将每个像素映射到一个新颜色(通过一个更复杂的函数,它本质上将 rgb 值作为一个元组返回一个新的 rgb 值元组),假设我想要每个像素映射到随机的 RGB 颜色(该参数只是为了使其与map 兼容):

import random


def rand_rgb(*_) -> tuple:
    return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)

我想做的是使用一些(最好是)高级并行性,例如multiprocessing

import multiprocessing


def row_rand_rgb(pixelrow: list) -> list:
    return list(map(rand_rgb, pixelrow)


with PIL.Image.open(imgname) as im:
    width, height = im.size
    pixelaccess = im.load()

    pixelaccess = multiprocessing.Pool().map(row_rand_rgb, pixelaccess)

    im.save()

如果pixelaccess 是“普通”Python 矩阵,即列表列表,那么这种类型的东西会起作用,并且图像中的每一行像素都会被单独处理,但这并不完全有效因为据我所知,pixel access object 不是列表列表。

我应该如何进行并行化?

【问题讨论】:

    标签: python image image-processing parallel-processing multiprocessing


    【解决方案1】:

    你总是可以使用 numpy:

    %matplotlib inline 
    import matplotlib.pyplot as plt
    import numpy as np
    
    with PIL.Image.open(imgname) as im:
        width, height = im.size
        npim = np.array(im.getdata()).reshape(width, height, 3)
    
        pixelaccess = multiprocessing.Pool().map(row_rand_rgb, npim)
    
        new_im = np.array(pixelaccess, dtype=np.float32).reshape(width, height, 3)
    
    plt.imshow(new_im)
    

    这是我得到的 1050x700 输入图像:

    【讨论】:

    • 之后如何保存图片?我也需要将其另存为单独的图像,最好没有 X 和 Y 轴。
    • 只需添加 Image.fromarray(new_im).save('new_image.jpg') 即可保存图片
    猜你喜欢
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2012-04-12
    • 2020-03-20
    • 2021-09-01
    相关资源
    最近更新 更多