我正在寻找一种简单的方法来计算下图中绿色像素的数量,其中原始图像相同,但绿色像素为黑色。
我试过了numpy.diff()
,但后来我计算了一些像素两次。我想过numpy.gradient()
——但在这里我不确定它是否是正确的工具。
我知道这个问题必须有很多解决方案,但我不知道如何用谷歌搜索它。我正在寻找python中的解决方案。
为了更清楚,我只有一张图像(只有黑白像素)。带有绿色像素的图像仅用于说明。
我正在寻找一种简单的方法来计算下图中绿色像素的数量,其中原始图像相同,但绿色像素为黑色。
我试过了numpy.diff()
,但后来我计算了一些像素两次。我想过numpy.gradient()
——但在这里我不确定它是否是正确的工具。
我知道这个问题必须有很多解决方案,但我不知道如何用谷歌搜索它。我正在寻找python中的解决方案。
为了更清楚,我只有一张图像(只有黑白像素)。带有绿色像素的图像仅用于说明。
您可以使用边缘检测内核来解决这个问题。
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]])
然后,我们将原始数组与内核进行卷积。请注意,边缘都是负数。
>>> convolve(a, kernel)
[[-1 -2 -3 -3]
[-2 5 3 3]
[-3 3 0 0]]
我们将计算负值的数量并得到结果。
>>> 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
你可以用内核做很多事情。例如,如果您不想包含对角线邻居,则可以修改内核。
kernel = np.array([[ 0, -1, 0],
[-1, 4, -1],
[ 0, -1, 0]])
这给出了以下输出。
>>> 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