我将OpenCV与Python结合使用,并尝试使用多进程来处理图像。图像是100x100
,我已经启动了4个进程。整个图像被分成四部分。这是一个过程:
processes = []
_ = mp.Process(target=kill, args=[blue[0:40, 0:47],0, 2])
_.start()
processes.append(_)
在此之后,我只加入所有流程
这是我的职责:
def kill(sliced, idx, perc):
for i in range (0, sliced.shape[0]):
for j in range (0, sliced.shape[1]):
if perc* sliced[i][j][0] - sliced[i][j][1] - sliced[i][j][2] < 0:
for k in range(0, 3):
sliced[i][j][k] = 0 #I am expecting this to alter my "blue" image
所以我期待着下一个,如果我想看到一个像素被遮住的图像。问题是,这似乎并没有修改原始的blue
图像
我正在向每个进程传递一个切片图像。处理完成后,我希望我的原始图像会被修改,而不是被修改。传递切片图像并修改它不应该修改我的原始图像?有没有拷贝/缓冲区的东西
多处理确实不适合这种情况,最好是一次处理多个独立的图像。它产生了独立的进程,这意味着没有共享内存,数据需要从一个进程“发送”到另一个进程,这会产生开销。因此,最好将其用于完全独立的处理操作。此外,生成过程需要时间,而您正在实现的非常简单的操作并不能证明这一点
您可以实现无循环的操作,从而获得非常重要的速度提升(至少2个数量级)。希望这样就不需要使用多个内核
假设
image
是通过OpenCV读入的NumPy数组:第二行相当复杂,因为
mask
是2D矩阵,而image
是3D矩阵。因此,我们需要将mask
扩展为3D,并通过沿新的第三维复制它,使其与image
具有相同的大小mask[:,:,np.newaxis]
是2D矩阵的3D版本,添加了大小为1的第三维np.broadcast_to()
然后将大小为1的维度复制到请求的形状image.shape
。这个扩展掩码现在可以用来索引到image
。通过使用掩码(布尔矩阵)进行索引,我们只选择image
的那些矩阵元素,其中mask
是True
。因此,指定仅更改选定的像素另一个使用NumPy加速Python循环的重要工具是Numba。如果一个操作不能很容易地矢量化,那就是可以尝试的方法
相关问题 更多 >
编程相关推荐