0

The goal is to overcome the problem of slow execution of nested loops in python by using the built-in functions in numpy.

In the code below, I read an image with imread (colors: BGR) into src (a numpy array) and I define thresholds for each color (BGR respectively). Then I loop over src pixel-by-pixel (with two for nested loops), at each iteration I test if the current pixel meets the threshold (three conditions for each value: Blue, Green and Red), in the positive case (the pixel satisfies the conditions) I save its coordinates in a list (line number: i, column number: 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))

So, I would like to know how to rewrite this code using numpy built-in functions to benefit from its speed?

1 Answer 1

2

You can do this:

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

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

Output:

[(1, 0)]

Note: np.where((a > (10,20,30)).all(-1)) alone would give you [array([1]), array([0])] which might be better in some cases.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.