I am looking for an easy way to count the number of the green pixels in the image below, where the original image is the same but the green pixels are black.
I tried it with numpy.diff()
, but then I am counting some pixels twice. I thought about numpy.gradient()
– but here I am not sure if it is the right tool.
I know there have to be many solutions to this problem, but I don't know how to google for it. I am looking for a solution in python.
To make it clearer, I have only one image (only black and white pixels). The image with the green pixel is just for illustration.
You can use the edge detection kernel for this problem.
import numpy as np
from scipy.ndimage import convolve
a = np.array([[0, 0, 0, 0],
[0, 1, 1, 1],
[0, 1, 1, 1]])
kernel = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])
Then, we will convolve the original array with the kernel. Notice that the edges are all negatives.
>>> convolve(a, kernel)
[[-1 -2 -3 -3]
[-2 5 3 3]
[-3 3 0 0]]
We will count the number of negative values and get the result.
>>> np.where(convolve(a, kernel) < 0, 1, 0)
[[1 1 1 1]
[1 0 0 0]
[1 0 0 0]]
>>> np.sum(np.where(convolve(a, kernel) < 0, 1, 0))
6
There are a lot of things you can do with the kernel. For example, you can modify the kernel if you don't want to include diagonal neighbors.
kernel = np.array([[ 0, -1, 0],
[-1, 4, -1],
[ 0, -1, 0]])
This gives the following output.
>>> np.where(convolve(a, kernel) < 0, 1, 0)
[[0 1 1 1]
[1 0 0 0]
[1 0 0 0]]
>>> np.sum(np.where(convolve(a, kernel) < 0, 1, 0))
5
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With