将值分配到图像数组的随机块的有效方法?

2024-03-30 08:08:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个三维numpy阵列。这是一个二维正方形图像的数组,所有的大小都一样。我的任务是阻止了一个随机正方形补丁的图像(设置所有的像素值为0)。在我只有一张图片的情况下,我可以想出如何做到这一点,如下所示

x = np.random.randint(image_width - size)
y = np.random.randint(image_width - size)
image[x:x + size, y:y + size] = 0

其中size是被封锁区域的大小。我不知道如何有效地将此技术应用于二维图像的阵列,其中每个图像都随机生成被遮挡的面片(不一定是阵列中每个图像中被遮挡的相同面片)。我觉得有点迷失在所有新的索引工具,我必须处理(广播,花哨的索引等),并想知道是否有一个快速和简单的方法来做到这一点,谢谢。目前我的方法是使用for循环对每个图像进行迭代,一次只做一个图像,但我想知道numpy是否足够强大,能够以某种方式一下子完成所有图像。我意识到我需要

x_array = np.random.randint(image_width - size, size=len(image_array))
y_array = np.random.randint(image_width - size, size=len(image_array))

但我不知道在哪里。你知道吗


Tags: 方法图像imagenumpysizelennprandom
1条回答
网友
1楼 · 发布于 2024-03-30 08:08:24

我们可以利用基于^{}^{}来获得滑动窗口。More info on use of ^{} based ^{}。你知道吗

from skimage.util.shape import view_as_windows

# Get sliding windows as views
w = view_as_windows(image_array,(1,size,size))[...,0,:,:]

# Index with advanced-indexing into windows array and
# assign into it, thus reassigning into input array directly being views
w[np.arange(len(x_array)),x_array,y_array] = 0

样本运行

设置输入-

In [60]: image_array # input array
Out[60]: 
array([[[54, 57, 74, 77, 77],
        [19, 93, 31, 46, 97],
        [80, 98, 98, 22, 68],
        [75, 49, 97, 56, 98]],

       [[91, 47, 35, 87, 82],
        [19, 30, 90, 79, 89],
        [57, 74, 92, 98, 59],
        [39, 29, 29, 24, 49]],

       [[42, 75, 19, 67, 42],
        [41, 84, 33, 45, 85],
        [65, 38, 44, 10, 10],
        [46, 63, 15, 48, 27]]])

In [68]: size
Out[68]: 2

# x and y starting indices for 0s assignments 
In [65]: x_array
Out[65]: array([1, 0, 1])

In [66]: y_array
Out[66]: array([2, 2, 0])

使用建议的解决方案-

In [62]: w = view_as_windows(a,(1,size,size))[...,0,:,:]

In [63]: w[np.arange(len(x_array)),x_array,y_array] = 0

In [64]: image_array # verify
Out[64]: 
array([[[54, 57, 74, 77, 77], # start at (1,2)
        [19, 93,  0,  0, 97],
        [80, 98,  0,  0, 68],
        [75, 49, 97, 56, 98]],

       [[91, 47,  0,  0, 82], # start at (0,2)
        [19, 30,  0,  0, 89],
        [57, 74, 92, 98, 59],
        [39, 29, 29, 24, 49]],

       [[42, 75, 19, 67, 42], # start at (1,0)
        [ 0,  0, 33, 45, 85],
        [ 0,  0, 44, 10, 10],
        [46, 63, 15, 48, 27]]])

相关问题 更多 >