gpt4 book ai didi

具有多个条件的Python numpy数组迭代图像

转载 作者:太空宇宙 更新时间:2023-11-03 21:19:11 25 4
gpt4 key购买 nike

我正在过滤一些图像以删除不必要的背景,到目前为止,我在检查像素 BGR(使用 openCV)值方面取得了最大的成功。问题是用 2 个嵌套循环迭代图像太慢了:

h, w, channels = img.shape
for x in xrange(0,h):
for y in xrange (0,w):
pixel = img[x,y]
blue = pixel[0]
green = pixel[1]
red = pixel[2]

if green > 110:
img[x,y] = [0,0,0]
continue

if blue < 100 and red < 50 and green > 80:
img[x,y] = [0,0,0]
continue

还有几个更相似的 if 语句,但您明白了。问题是在 i7 的 672x1250 上这需要大约 10 秒。

现在,我可以像这样轻松地执行第一个 if 语句:

img[np.where((img > [0,110,0]).all(axis=2))] = [0,0,0]

而且速度要快得多,但我似乎无法使用 np.where 执行其他包含多个条件的 if 语句。

这是我尝试过的:

img[np.where((img < [100,0,0]).all(axis=2)) & ((img < [0,0,50]).all(axis=2)) & ((img > [0,80,0]).all(axis=2))] = [0,0,0]

但是抛出一个错误:

ValueError: operands could not be broadcast together with shapes (2,0) (1250,672)

任何关于如何使用 np.where(或任何比 2 嵌套循环更快的方法)正确迭代图像的想法都会有很大帮助!

最佳答案

你可以这样表达条件(没有np.where):

import numpy as np
img = np.random.randint(255, size=(4,4,3))
blue, green, red = img[..., 0], img[..., 1], img[..., 2]
img[(green > 110) | ((blue < 100) & (red < 50) & (green > 80))] = [0,0,0]

In [229]: %%timeit img = np.random.randint(255, size=(672,1250,3))
.....: blue, green, red = img[..., 0], img[..., 1], img[..., 2]
.....: img[(green > 110) | ((blue < 100) & (red < 50) & (green > 80))] = [0,0,0]
.....:
100 loops, best of 3: 14.9 ms per loop

In [240]: %%timeit img = np.random.randint(255, size=(672,1250,3))
.....: using_loop(img)
.....:
1 loop, best of 3: 1.39 s per loop

其中 using_loop(img) 执行问题中发布的双循环。

关于具有多个条件的Python numpy数组迭代图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37060788/

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