Python 如果颜色匹配,则创建numpy rgb数组的布尔掩码
我想识别两种颜色之间的所有黄色像素,例如[255,255,0]是亮黄色,[200,200,50]是中黄色Python 如果颜色匹配,则创建numpy rgb数组的布尔掩码,python,arrays,numpy,rgb,Python,Arrays,Numpy,Rgb,我想识别两种颜色之间的所有黄色像素,例如[255,255,0]是亮黄色,[200,200,50]是中黄色 c = color_array = np.array([ [255, 255, 0], # bright yellow [200, 200, 50]]) # mid yellow 因此,rgb范围可以表示为: (min, max) tuple... r (200, 255) g (200, 255) b (0, 50) 我有一个2D(图像高度x图像宽度)[r,g,b]数组
c = color_array = np.array([
[255, 255, 0], # bright yellow
[200, 200, 50]]) # mid yellow
因此,rgb范围可以表示为:
(min, max) tuple...
r (200, 255)
g (200, 255)
b (0, 50)
我有一个2D(图像高度x图像宽度)[r,g,b]数组:
image = np.random.randint(0, 255, (5, 4, 3))
array([[[169, 152, 65],
[ 46, 123, 39],
[116, 190, 227],
[ 95, 138, 243]],
[[120, 75, 156],
[ 94, 168, 139],
[131, 0, 0],
[233, 43, 28]],
[[195, 65, 198],
[ 33, 161, 231],
[125, 31, 101],
[ 56, 123, 151]],
[[118, 124, 220],
[241, 221, 137],
[ 71, 65, 23],
[ 91, 75, 178]],
[[153, 238, 7],
[ 2, 154, 45],
[144, 33, 94],
[ 52, 188, 4]]])
如果r、g、b值在颜色数组中的两个颜色值之间,我希望生成一个带True的2D数组
[[T, F, F, T],
[T, F, F, T],
... ]]
我一直在努力使索引正确。这里有一个解决方案不是特别优雅,但应该可以:
def color_mask(array, r_lim, g_lim, b_lim):
"""
array : m x n x 3 array of colors
*_lim are 2-element tuples, where the first element is expected to be <= the second.
"""
r_mask = ((array[..., 0] >= r_lim[0]) & (array[..., 0] <= r_lim[1]))
g_mask = ((array[..., 1] >= g_lim[0]) & (array[..., 1] <= g_lim[1]))
b_mask = ((array[..., 2] >= b_lim[0]) & (array[..., 2] <= b_lim[1]))
return r_mask & g_mask & b_mask
def颜色掩码(数组、r\u-lim、g\u-lim、b\u-lim):
"""
数组:m x n x 3颜色数组
*_lim是两个元素的元组,其中第一个元素应该是,这里有一个解决方案不是特别优雅,但应该可以工作:
def color_mask(array, r_lim, g_lim, b_lim):
"""
array : m x n x 3 array of colors
*_lim are 2-element tuples, where the first element is expected to be <= the second.
"""
r_mask = ((array[..., 0] >= r_lim[0]) & (array[..., 0] <= r_lim[1]))
g_mask = ((array[..., 1] >= g_lim[0]) & (array[..., 1] <= g_lim[1]))
b_mask = ((array[..., 2] >= b_lim[0]) & (array[..., 2] <= b_lim[1]))
return r_mask & g_mask & b_mask
def颜色掩码(数组、r\u-lim、g\u-lim、b\u-lim):
"""
数组:m x n x 3颜色数组
*_lim是两个元素元组,其中第一个元素应该是我可以想象几种方法来解决这个问题:
一种方法是单独比较所有元素:
c = color_array
within_box = np.all(
np.logical_and(
np.min(c, axis=0) < image,
image < np.max(c, axis=0)
),
axis=-1
)
这相当于在(较大的框)中查找由color\u array
定义的小子集(框)内的所有像素
另一种解决方案是在color\u数组中的两点之间画一条线,并且:
之后,您可以找到距离该线一定距离内的所有像素,即
within_distance = distance < 25
然后,查找一个限制内的所有像素可以解释为查找两个限制颜色的平均颜色周围球体中的所有像素。例如,如果您选择的距离是两点之间距离的一半
within_sphere = distance_to_mean < (np.linalg.norm(c) / 2)
然后在这个空间中进行计算。我可以想象几种方法来解决这个问题:
一种方法是单独比较所有元素:
c = color_array
within_box = np.all(
np.logical_and(
np.min(c, axis=0) < image,
image < np.max(c, axis=0)
),
axis=-1
)
这相当于在(较大的框)中查找由color\u array
定义的小子集(框)内的所有像素
另一种解决方案是在color\u数组中的两点之间画一条线,并且:
之后,您可以找到距离该线一定距离内的所有像素,即
within_distance = distance < 25
然后,查找一个限制内的所有像素可以解释为查找两个限制颜色的平均颜色周围球体中的所有像素。例如,如果您选择的距离是两点之间距离的一半
within_sphere = distance_to_mean < (np.linalg.norm(c) / 2)
你能让你的数组说5x4
而不是5x3
吗?这将更加清楚地表明第三维是颜色。为什么color\u array
4维?您能否非常清楚地指定在范围内意味着什么?这是否意味着255>=r>=200和255>=g>=200和0刚刚更改了维度,同意这更清楚。这将产生一个5x4布尔数组,其中颜色匹配如下:如果r,g,b颜色为2005x4
,而不是5x3
?这将更加清楚地表明第三维是颜色。为什么color\u array
4维?您能否非常清楚地指定在范围内意味着什么?这是否意味着255>=r>=200和255>=g>=200和0刚刚更改了维度,同意这更清楚。这将产生一个5x4布尔数组,其中颜色匹配如下:如果r,g,b颜色为200import skimage
image_lab = skimage.color.rgb2lab(image / 255)
color_array_lab = skimage.color.rgb2lab(color_array[np.newaxis, ...] / 255)