首页 > 解决方案 > 如何使用 Numpy 在 Python 中加速 OpenCV 图像的循环?

问题描述

目标是通过使用numpy.

在下面的代码中,我将带有imread(colors: BGR) 的图像读入src(一个 numpy 数组),并为每种颜色定义阈值(分别为 BGR)。然后我src逐像素循环(有两个for嵌套循环),在每次迭代中我测试当前像素是否满足阈值(每个值的三个条件:蓝色、绿色和红色),在肯定的情况下(像素满足条件)我将其坐标保存在列表中(行号:i,列号:j)。

import cv2

src = cv2.imread('path_to_the_image')   # A numpy array with shape: (width, height, 3) ["3" for BGR]

cond = [10, 20, 30]  # A threshold for each color: Blue, Green and Red respectively

indexes = []  # To save pixel's coordinates which satisfies all three conditions

for i in range(0, src.shape[0]):  # Loop over lines (width)
    for j in range(0, src.shape[1]):  # Loop over columns (height)
        if src[i, j, 0] >= cond[0] and src[i, j, 1] >= cond[1] and src[i, j, 2] >= cond[2]:
            indexes.append((i, j))

那么,我想知道如何使用numpy内置函数重写此代码以受益于它的速度?

标签: pythonnumpyopencv

解决方案


你可以这样做:

a = np.array([[[1,2,3], [10,20,30]],
     [[40,50,60], [10, 30, 20]]
    ])

[*zip(*np.where((a > (10,20,30)).all(-1)))]

输出:

[(1, 0)]

注意np.where((a > (10,20,30)).all(-1))单独会给你[array([1]), array([0])]在某些情况下可能会更好。


推荐阅读