gpt4 book ai didi

python - 功能修改原图

转载 作者:行者123 更新时间:2023-12-02 16:59:21 25 4
gpt4 key购买 nike

我将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
所以我期待下一个,如果我要 cv2.imshow("blue", blue)看到像素被涂黑的图像。问题在于,这似乎无法修改原始的 blue图像。
我正在将 slice 图像传递给每个过程。在完成这些过程之后,我期望可以修改我的原始图像,而不是对其进行更改。传递 slice 图像并对其进行修改不应该修改我的原始图像吗?是否有任何复制/缓冲的东西?

最佳答案

IMO确实不适合进行多处理,因此最好同时处理多个独立的图像。它产生单独的进程,这意味着没有共享内存,并且需要将数据从一个进程“发送”到另一个进程,这会产生开销。因此,最好将其用于完全独立的处理操作。此外,产卵过程需要时间,而所执行的非常简单的操作并不能证明这一点。
您可以实现不带循环的操作,从而大大提高导入速度(至少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。通过使用掩码( bool(boolean) 矩阵)进行索引,我们仅选择 imagemaskTrue的矩阵元素。因此,分配仅改变所选像素。

另一个使用NumPy加快Python循环速度的重要工具是 Numba。如果无法轻易将操作向量化,则可以尝试这种方法。

关于python - 功能修改原图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62861877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com