使用 OpenCV/Numpy 拼合图像背景
Flatten image background using OpenCV/Numpy
我正在创建一个图像分析工具(使用 Python)。
我已经有了 Otsu 阈值处理产生的分割图像。
使用 OpenCv kmeans 函数,我将图像中的颜色数量减少到 4。
K-means 集群之一应该是黑色背景(BGR 值 [0,0,0] )。
由于 K-means 算法,背景像素现在不是 [0,0,0],而是显示像素值,例如[0,2,1].
我想让这个背景簇再次变黑。图像表示为 3D numpy 数组。目前我只是在反复调整背景:
X, Y, Z = img.shape
for xi in xrange(X):
for yi in xrange(Y):
if all([value < 10 for value in img[xi][yi]]):
img[xi][yi] = np.zeros((1,3), dtype=int)
这是一个相对较慢的操作。有没有更聪明的方法,可能使用专门的 OpenCV/Numpy 函数?
您可以像这样矢量化此操作:
In [29]: A = np.random.random_integers(0,10,(2,4,3))
In [30]: A
Out[30]:
array([[[ 5, 9, 1],
[ 4, 0, 2],
[ 0, 5, 9],
[ 8, 7, 8]],
[[ 1, 6, 7],
[ 8, 10, 9],
[ 2, 10, 1],
[ 9, 2, 3]]])
In [32]: np.all(A < 5, axis=-1) # I chose a threshold of 5
Out[32]:
array([[False, True, False, False],
[False, False, False, False]], dtype=bool)
In [33]: A[np.all(A < 5, axis=-1)] = 100 # and set the values to 100 to easily show what has changed
In [34]: A
Out[34]:
array([[[ 5, 9, 1],
[100, 100, 100],
[ 0, 5, 9],
[ 8, 7, 8]],
[[ 1, 6, 7],
[ 8, 10, 9],
[ 2, 10, 1],
[ 9, 2, 3]]])
通过指定 np.all(some_array, axis=-1)
,您将对最后一个轴执行 all
操作,这是 RGB 值所在的位置。您会看到,在此测试阵列中,只有一个这样的像素(在 A[0,1]
)满足该条件。
我正在创建一个图像分析工具(使用 Python)。 我已经有了 Otsu 阈值处理产生的分割图像。 使用 OpenCv kmeans 函数,我将图像中的颜色数量减少到 4。 K-means 集群之一应该是黑色背景(BGR 值 [0,0,0] )。
由于 K-means 算法,背景像素现在不是 [0,0,0],而是显示像素值,例如[0,2,1].
我想让这个背景簇再次变黑。图像表示为 3D numpy 数组。目前我只是在反复调整背景:
X, Y, Z = img.shape
for xi in xrange(X):
for yi in xrange(Y):
if all([value < 10 for value in img[xi][yi]]):
img[xi][yi] = np.zeros((1,3), dtype=int)
这是一个相对较慢的操作。有没有更聪明的方法,可能使用专门的 OpenCV/Numpy 函数?
您可以像这样矢量化此操作:
In [29]: A = np.random.random_integers(0,10,(2,4,3))
In [30]: A
Out[30]:
array([[[ 5, 9, 1],
[ 4, 0, 2],
[ 0, 5, 9],
[ 8, 7, 8]],
[[ 1, 6, 7],
[ 8, 10, 9],
[ 2, 10, 1],
[ 9, 2, 3]]])
In [32]: np.all(A < 5, axis=-1) # I chose a threshold of 5
Out[32]:
array([[False, True, False, False],
[False, False, False, False]], dtype=bool)
In [33]: A[np.all(A < 5, axis=-1)] = 100 # and set the values to 100 to easily show what has changed
In [34]: A
Out[34]:
array([[[ 5, 9, 1],
[100, 100, 100],
[ 0, 5, 9],
[ 8, 7, 8]],
[[ 1, 6, 7],
[ 8, 10, 9],
[ 2, 10, 1],
[ 9, 2, 3]]])
通过指定 np.all(some_array, axis=-1)
,您将对最后一个轴执行 all
操作,这是 RGB 值所在的位置。您会看到,在此测试阵列中,只有一个这样的像素(在 A[0,1]
)满足该条件。