首先是一些上下文:
我正在尝试写下一个 python 脚本,将灰度 (.tif) 中的图像转换为具有所谓“jet”颜色图的 .jpeg。我设法用 for 循环来做到这一点,但对于一张图像(处理数百万像素!)来说有点长,所以我想使用多处理。
我的问题是,要将每个灰色像素转换为彩色像素,我必须使用两个变量(光强度的最小值“min_img”和向量“dx_cm”从初始灰度到 256比例,对应于 jet 颜色图)。
因此,为了将“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')
梵蒂冈之花
心有法竹
相关分类