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的评论中返回图像的遮罩区域(不带遮罩),我猜我可以通过某种方式重塑遮罩阵列。重塑,但不清楚这与你的问题完全不同。请解释为什么不是?考虑到我写了这个问题,我确实知道我需要的输出。我确信是的,在这种情况下,你可能想考虑删除这个问题。我只是说你写的问题与答案不符。未来的读者也是如此。如果你根据网站规则更新问题,那完全是另一回事。在什么方面它与问题不符?我没有在手机上看到你的更新。很抱歉,这根本不是你要问的问题,请解释为什么不是?考虑到我写了这个问题,我确实知道我需要的输出。我确信是的,在这种情况下,你可能想考虑删除这个问题。我只是说你写的问题与答案不符。未来的读者也是如此。如果你根据网站规则更新问题,那完全是另一回事。在什么方面它与问题不符?我没有在手机上看到你的更新。很抱歉。