Python PIL并行(并行映射)

Python PIL并行(并行映射),python,image,image-processing,parallel-processing,multiprocessing,Python,Image,Image Processing,Parallel Processing,Multiprocessing,我想用PIL打开一个图像,并将每个像素映射到一种新颜色(通过一个更复杂的函数,该函数本质上将rgb值作为元组,并返回一个新的rgb值元组),比方说,我想将每个像素映射到一种随机rgb颜色(该参数仅用于使其与map兼容): 我想做的是使用一些(最好)高级并行,例如多处理: import multiprocessing def row_rand_rgb(pixelrow: list) -> list: return list(map(rand_rgb, pixelrow) wi

我想用PIL打开一个图像,并将每个像素映射到一种新颜色(通过一个更复杂的函数,该函数本质上将rgb值作为元组,并返回一个新的rgb值元组),比方说,我想将每个像素映射到一种随机rgb颜色(该参数仅用于使其与
map
兼容):

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

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对象
不是列表


我应该如何进行并行化?

您可以始终使用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输入图像:


您始终可以使用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')即可保存图像。以后如何保存图像?我还需要将其另存为一个单独的图像,最好没有X轴和Y轴。只需添加image.fromarray(new_im).save('new_image.jpg')即可保存图像