Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在3d numpy阵列中选择“黑色”单元?_Python_Arrays_Image_Numpy - Fatal编程技术网

Python 如何在3d numpy阵列中选择“黑色”单元?

Python 如何在3d numpy阵列中选择“黑色”单元?,python,arrays,image,numpy,Python,Arrays,Image,Numpy,我有一个512、512、3形状的NumPy数组,即RGB图像。该阵列是从一个二进制掩码创建的,我用枕头将其读入一个3d阵列: data = np.array(Image.open(mask).convert('RGB')) 我想将遮罩中项目的颜色更改为RGB颜色。为此,我需要选择数组中所有在所有3维(即0,0,0=黑色)中没有零值的单元格,因为这是背景 我尝试了以下方法——将非黑色单元格染成绿色——但没有成功: data[data[:,:,:] > 0] = (0, 255, 0) 及

我有一个512、512、3形状的NumPy数组,即RGB图像。该阵列是从一个二进制掩码创建的,我用枕头将其读入一个3d阵列:

data = np.array(Image.open(mask).convert('RGB'))
我想将遮罩中项目的颜色更改为RGB颜色。为此,我需要选择数组中所有在所有3维(即0,0,0=黑色)中没有零值的单元格,因为这是背景

我尝试了以下方法——将非黑色单元格染成绿色——但没有成功:

data[data[:,:,:] > 0] = (0, 255, 0)

在这两种情况下都会出现以下错误:

ValueError: NumPy boolean array indexing assignment cannot assign 3 input values to the 8679 output values where the mask is true
如何选择3d numpy阵列中的所有“黑色”单元

这应该不会太难,但我无法理解,而且在S/O上似乎还没有类似的问题,但如果我错了,请让我知道

这是我想要的结果:将左侧的灰色遮罩转换为右侧的RGB颜色遮罩

使用:

replace_arr = np.array([[[100, 255, 100]]]).repeat(512, 0).repeat(512, 1)
mask = np.repeat(np.all(arr == 0, axis = -1)[:, :, np.newaxis], 3, axis = -1)
arr = np.where(mask, 0, replace_arr)
另一种方法:

创建一个大小为512512的二维maskTrue/False,该值为True 在i,j,如果arr[i,j,:]中的任何一个不等于0。 使用idx=np.argwheremask获取与掩码中的真值对应的索引,并将这些索引设置为arr中的新值


试试np.where.:当值不全为零时,是否要将第二个通道设置为255?是的,但不一定是第二个通道:我想为数组中所有非黑色且值为[0,0,0]的单元格指定RGB颜色绿色只是一个示例。此解决方案仅适用于更改一个颜色通道,但是我想给非黑色的值[0,0,0]分配一个RGB值a三元组。@Sytze我已经更新了答案。完美,这正是我的意思!我更喜欢第二种方法。你能不能也对你所做的做一个简短的解释?@Sytze我已经做了解释。
replace_arr = np.array([[[100, 255, 100]]]).repeat(512, 0).repeat(512, 1)
mask = np.repeat(np.all(arr == 0, axis = -1)[:, :, np.newaxis], 3, axis = -1)
arr = np.where(mask, 0, replace_arr)
mask = np.any(arr != 0, axis = -1)
idx = np.argwhere(mask)
arr[idx[:, 0], idx[:, 1], :] = [100, 255, 100]