сначала немного контекста:
Я пытаюсь записать скрипт на python для преобразования изображения в оттенках серого (.tif) в формат .jpeg с так называемой цветовой картой «jet».Мне удалось сделать это с помощью цикла for, но он немного длинен для одного изображения (миллионы пикселей для обработки!), Поэтому я хотел бы использовать многопроцессорность.
Моя проблема здесь в том, что для преобразования каждого серого пикселя в цветной я должен использовать две переменные (минимальное значение интенсивности света '' min_img '' и вектор '' dx_cm '', чтобы перейти отначальная серая шкала до 256, соответствующая цветовой карте струй).
Таким образом, чтобы передать информацию о '' min_img '' и '' dx_cm '' в процессы, которые я пытаюсь использовать multiprocessing.Value ()но в ответ я получаю ошибку:
RuntimeError: Synchronized objects should only be shared between processes through inheritance
Я пробовал много разных вещей из разных источников, и независимо от версии моего кода, я борюсь с этой ошибкой.Так что извините, если мой код не чистый, я был бы очень признателен, если бы кто-то мог помочь мне с этим.
Мой нерабочий код:
import multiprocessing
from PIL import Image
from matplotlib import cm
def fun(gr_list,dx,minp):
dx_cmp = dx.value
min_imgp = minp.value
rgb_res=list()
for i in range(len(gr_list)):
rgb_res.extend(cm.jet(round(((gr_list[i]-min_imgp)/dx_cmp)-1))[0:-1])
return rgb_res
if __name__ == '__main__':
RGB_list=list()
n = multiprocessing.cpu_count()
img = Image.open(r'some_path_to_a.tif')
Img_grey=list(img.getdata())
dx_cm = multiprocessing.Value('d',(max(Img_grey)-min(Img_grey))/256)
min_img = multiprocessing.Value('d',min(Img_grey))
with multiprocessing.Pool(n) as p:
RGB_list = list(p.map(fun, (Img_grey,dx_cm,min_img)))
res = Image.frombytes("RGB", (img.size[0], img.size[1]), bytes([int(0.5 + 255*i) for i in RGB_list]))
res.save('rgb_file.jpg')
PS: Вот пример начального цикла for, который я хотел бы распараллелить:
from PIL import Image
from matplotlib import cm
if __name__ == '__main__':
img = Image.open(r'some_path_to_a.tif')
Img_grey = list(img.getdata())
dx_cm = (max(Img_grey)-min(Img_grey))/256
min_img = min(Img_grey)
Img_rgb = list()
for i in range(len(Img_grey)):
Img_rgb.extend(cm.jet(round(((Img_grey[i]-min_img)/dx_cm)-1))[0:-1])
res = Image.frombytes("RGB", (img.size[0], img.size[1]), bytes([int(0.5 + 255*i) for i in Img_rgb]))
res.save('rgb_file.jpg')