函数修改原始图像

2024-05-14 02:33:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我将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图像

我正在向每个进程传递一个切片图像。处理完成后,我希望我的原始图像会被修改,而不是被修改。传递切片图像并修改它不应该修改我的原始图像?有没有拷贝/缓冲区的东西


Tags: in图像for进程过程切片rangemp
1条回答
网友
1楼 · 发布于 2024-05-14 02:33:18

多处理确实不适合这种情况,最好是一次处理多个独立的图像。它产生了独立的进程,这意味着没有共享内存,数据需要从一个进程“发送”到另一个进程,这会产生开销。因此,最好将其用于完全独立的处理操作。此外,生成过程需要时间,而您正在实现的非常简单的操作并不能证明这一点

您可以实现无循环的操作,从而获得非常重要的速度提升(至少2个数量级)。希望这样就不需要使用多个内核

假设image是通过OpenCV读入的NumPy数组:

mask = perc * image[:,:,0] - image[:,:,1] - image[:,:,2] < 0
image[np.broadcast_to(mask[:,:,np.newaxis], image.shape)] = 0

第二行相当复杂,因为mask是2D矩阵,而image是3D矩阵。因此,我们需要将mask扩展为3D,并通过沿新的第三维复制它,使其与image具有相同的大小mask[:,:,np.newaxis]是2D矩阵的3D版本,添加了大小为1的第三维np.broadcast_to()然后将大小为1的维度复制到请求的形状image.shape。这个扩展掩码现在可以用来索引到image。通过使用掩码(布尔矩阵)进行索引,我们只选择image的那些矩阵元素,其中maskTrue。因此,指定仅更改选定的像素


另一个使用NumPy加速Python循环的重要工具是Numba。如果一个操作不能很容易地矢量化,那就是可以尝试的方法

相关问题 更多 >