Python 从图像numpy数组中删除False/True的numpy数组

Python 从图像numpy数组中删除False/True的numpy数组,python,numpy,Python,Numpy,我有一个图像数组 img = [[[63 48 27] [ 63 48 27] [ 63 48 27] ... [117 88 70] [113 84 66] [111 82 64]] [[ 64 49 28] [ 64 49 28] [ 64 49 28] ... [117 88 70] [114 85 67] [111 82 64]] [[ 65 50 29] [ 66 51

我有一个图像数组

img = [[[63  48  27]
  [ 63  48  27]
  [ 63  48  27]
  ...
  [117  88  70]
  [113  84  66]
  [111  82  64]]

 [[ 64  49  28]
  [ 64  49  28]
  [ 64  49  28]
  ...
  [117  88  70]
  [114  85  67]
  [111  82  64]]

 [[ 65  50  29]
  [ 66  51  30]
  [ 66  51  30]
  ...
  [118  89  71]
  [114  85  67]
  [111  82  64]]...
还有另一个像素数组,我想从图像数组中保留:

mask = [[[False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]
  ...
  [False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]]]
我以为我可以做
img[mask]
,但我得到
布尔索引与维度0上的索引数组不匹配;维度为549,但相应的布尔维度为1
。如何将掩码数组扩展回正确的维度,它来自将detectron2掩码转换为numpy数组
mask=outputs['instances'].pred_masks.numpy()
(最初是张量)。或者,我认为这可能更容易,如果numpy掩码数组中的值是
False
,那么将图像数组中的元素转换为白色/255

我使用的函数是:

from matplotlib.image import imread
import scipy.misc


def cropper(org_image_path, mask_array, out_file_name):
    img = imread(org_image_path)
    output = img[mask_array]
    scipy.misc.toimage(output).save(out_file_name)


对于那些感兴趣的人来说,尼古拉斯的评论是一个有用的凹凸(谢谢)-只是将遮罩阵列更改为在同一轴上&相同的形状。然后只需简单的编辑即可更改值:

from matplotlib.image import imread
import scipy.misc
from PIL import Image  

def cropper(org_image_path, mask_array, out_file_name):
        img = imread(org_image_path)
        mask_array = np.moveaxis(mask_array, 0, -1)
        mask_array = np.repeat(mask_array, 3, axis=2)
        output = np.where(mask_array==False, 255, img)
        im = Image.fromarray(output)
        im.save(out_file_name)

对于那些感兴趣的人来说,尼古拉斯的评论是一个有用的凹凸(谢谢)-只是将遮罩阵列更改为在同一轴上&相同的形状。然后只需简单的编辑即可更改值:

from matplotlib.image import imread
import scipy.misc
from PIL import Image  

def cropper(org_image_path, mask_array, out_file_name):
        img = imread(org_image_path)
        mask_array = np.moveaxis(mask_array, 0, -1)
        mask_array = np.repeat(mask_array, 3, axis=2)
        output = np.where(mask_array==False, 255, img)
        im = Image.fromarray(output)
        im.save(out_file_name)

给定形状
(M,N,3)
的图像和形状
(1,M,N)
的遮罩,您可以使用简单的布尔索引将图像的
False
元素在所有通道中设置为255。广播在右边排列索引,索引在左边填充索引。这意味着要使遮罩与图像尺寸相对应,需要删除第一个轴。有多种方法可以做到这一点:

mask = mask[0]
mask = mask[0, ...]
mask = mask.squeeze()
mask = np.squeeze(mask)
mask = mask.reshape(mask.shape[1:])
mask = np.reshape(mask, mask.shape[1:])
...
在前两个维度匹配的情况下,您可以取消遮罩并执行直接赋值:

img[~mask] = 255
这可以组合成一个简单的单内衬:

img[~mask[0]] = 255

给定形状
(M,N,3)
的图像和形状
(1,M,N)
的遮罩,您可以使用简单的布尔索引将图像的
False
元素在所有通道中设置为255。广播在右边排列索引,索引在左边填充索引。这意味着要使遮罩与图像尺寸相对应,需要删除第一个轴。有多种方法可以做到这一点:

mask = mask[0]
mask = mask[0, ...]
mask = mask.squeeze()
mask = np.squeeze(mask)
mask = mask.reshape(mask.shape[1:])
mask = np.reshape(mask, mask.shape[1:])
...
在前两个维度匹配的情况下,您可以取消遮罩并执行直接赋值:

img[~mask] = 255
这可以组合成一个简单的单内衬:

img[~mask[0]] = 255


你能打印出他们的形状吗?img.shape=(549440,3)mask_array.shape=(1549440)你想知道如何将该遮罩应用到该图像上吗?@alan.elkin不,谢谢,我已经可以将遮罩应用到该图像上了,但我正试图从Nicolas的评论中返回图像的遮罩区域(没有遮罩),我猜我可以通过某种方式重塑面具阵列。重塑但不清楚如何打印出它们的形状?img.shape=(549440,3)mask_array.shape=(1549440)你想知道如何将面具应用于该图像吗?@alan.elkin不,谢谢,我已经可以将遮罩应用于图像,但我正试图从Nicolas的评论中返回图像的遮罩区域(不带遮罩),我猜我可以通过某种方式重塑遮罩阵列。重塑,但不清楚这与你的问题完全不同。请解释为什么不是?考虑到我写了这个问题,我确实知道我需要的输出。我确信是的,在这种情况下,你可能想考虑删除这个问题。我只是说你写的问题与答案不符。未来的读者也是如此。如果你根据网站规则更新问题,那完全是另一回事。在什么方面它与问题不符?我没有在手机上看到你的更新。很抱歉,这根本不是你要问的问题,请解释为什么不是?考虑到我写了这个问题,我确实知道我需要的输出。我确信是的,在这种情况下,你可能想考虑删除这个问题。我只是说你写的问题与答案不符。未来的读者也是如此。如果你根据网站规则更新问题,那完全是另一回事。在什么方面它与问题不符?我没有在手机上看到你的更新。很抱歉。