Last answered:

09 Aug 2022

Posted on:

07 Aug 2022


Confusing about av_pix function

in line 7
col = np.mean(....)

what is the img value to calculate mean?


1 answers ( 0 marked as helpful)
Posted on:

09 Aug 2022


Hey Pajjaphon,

Thank you for your question!

If I understand correctly, you are confused about what is happening inside the mean function.

It's important to understand what each of the parameters of the av_pix function are.
img is a numpy ndarray having dimensions (890, 1920). This you can confirm by adding 2 print-statements after the definition of img, namely:

img = cv2.imread('capstone_coins.png', cv2.IMREAD_GRAYSCALE)
img = cv2.GaussianBlur(img, (5, 5), 0)

circles is a numpy ndarray of dimensions (1, 8, 3). Therefore, circles[0, :] is a numpy ndarray of dimensions (8, 3). Each of the 8 rows represents a coin and each coin is described by 3 numbers - the pixel corresponding to the x-coordinate of the center of the coin, the pixel corresponding to the y-coordinate, and finally the radius of the coin. This you can confirm by adding several print-statements after the definition of the circles variable:

circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 0.9, 120, param1=50, param2=27, minRadius=60, maxRadius=120)
circles = np.uint16(np.around(circles))
print(circles[0, :].shape)

Finally, size is an integer given on line 41 when calling the av_pix function. Its value is 20.

Let's now go to the definition of the av_pix function on line 4. I will add several print-functions that will guide us through the process:

def av_pix(img, circles, size):
    av_value = []

    for coords in circles[0, :]:
        print(f'coords: {coords}')
        col = np.mean(img[coords[1] - size:coords[1] + size, coords[0] - size:coords[0] + size])

        print(f'sliced img shape: {img[coords[1]-size:coords[1]+size, coords[0]-size:coords[0]+size].shape}')
        print(f'average value: {col}\n')


    return av_value

Let's concentrate on line 7 in Giles' code.
The coords iterator represents each of the coins. Therefore, coords[0] corresponds to the x-coordinate and coords[1] corresponds to the y-coordinate. Let's take the first coin, such that
coords[0] = 1358
coords[1] = 254
size = 20
Let's now try and understand what the following slice represents

coords[1] - size:coords[1] + size

It corresponds to
which results in the following slice
Therefore, we are taking all 40 rows, starting from index 234 all the way to index 273 (note that the first number is included, while the second is not)..

Analogously, the following second slice

coords[0] - size:coords[0] + size

corresponds to
which results in
Therefore, we are also taking all 40 columns starting from index 1338 all the way to index 1377.

This has resulted in a 40x40 square matrix whose center is the center of the first coin. The mean of all numbers in the matrix is then calculated and stored in the col variable. This value is then appended to the av_value list and the procedure is then repeated for the 7 other coins.

Hope this helps! Try to play around with the print-functions, make sure you understand the outputs, and you will have no trouble understanding the whole algorithm :)

Kind regards,
365 Hristina

Submit an answer