Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.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 给定大小为m*n的输入图像X和大小为T的块,如何生成大小为T*T的k个随机非重叠块?_Python_Algorithm - Fatal编程技术网

Python 给定大小为m*n的输入图像X和大小为T的块,如何生成大小为T*T的k个随机非重叠块?

Python 给定大小为m*n的输入图像X和大小为T的块,如何生成大小为T*T的k个随机非重叠块?,python,algorithm,Python,Algorithm,在阅读报纸时,我提出了以下问题: 给定大小为mn、块大小为T的输入图像X,生成大小为TT的k个随机非重叠块 我提出了用左上角坐标表示每个块的想法。然后,我使用下面的一段代码来生成那些不重叠的块。虽然我在这段代码中使用了一些随机性,但结果不是随机的,也没有涵盖所有可能的情况。有什么有效的算法可以做到这一点吗?即使是用于进一步搜索的关键字也会受到欢迎 m, n = Y.shape T = 44 k = 30 possible_blocks_vert = m // T possible_blocks_

在阅读报纸时,我提出了以下问题:

给定大小为mn、块大小为T的输入图像X,生成大小为TT的k个随机非重叠块

我提出了用左上角坐标表示每个块的想法。然后,我使用下面的一段代码来生成那些不重叠的块。虽然我在这段代码中使用了一些随机性,但结果不是随机的,也没有涵盖所有可能的情况。有什么有效的算法可以做到这一点吗?即使是用于进一步搜索的关键字也会受到欢迎

m, n = Y.shape
T = 44
k = 30
possible_blocks_vert = m // T
possible_blocks_horiz = n // T
possible_blocks = possible_blocks_vert * possible_blocks_horiz
if possible_blocks < k:
    assert False
else:
    last_possible_starting = (divmod(m, T)[1], divmod(n, T)[1])
    random_y0, random_x0 = np.random.randint(last_possible_starting[0]), np.random.randint(last_possible_starting[1])
    random_xs = [random_x0+i*T for i in range(possible_blocks_horiz)]
    random_ys = [random_y0+i*T for i in range(possible_blocks_vert)]
    
    i = 0
    Xs = []
    Ys = []
    for x in np.random.permutation(random_xs):
        for y in np.random.permutation(random_ys):
            Xs.append(x)
            Ys.append(y)
            i += 1
            if (i >= k):
                break
        if (i >= k):
            break
Xs, Ys
m,n=Y.shape
T=44
k=30
可能的\u块\u垂直=m//T
可能的\u块\u水平=n//T
可能的区块=可能的区块\u垂直*可能的区块\u水平
如果可能,_块=k):
打破
如果(i>=k):
打破
Xs,Ys
此实现至少有两个缺点:

  • 选择首先选择所有第一个随机行,然后选择所有第二个随机行,依此类推,直到选择了所有k个块
  • 选择并不是分布在所有可能的地方
注意。本文提出了一种称为局部香农熵(LSE)的新度量,它生成k个随机块,并将其平均香农熵计算为LSE。

您可以尝试(图7.18 c)。也就是说,将图像分割为(至少)
k个
单元,并将每个块放入其中某个随机选取的单元中


为简单起见,假设图像为256x256像素,10个块中的每个块为32x32像素。将图像分割成4x4(
ceil(sqrt(k))
)单元的规则网格,每个单元都是64x64大的,从16个单元中选择10个单元,将32x32块随机放置到每个64x64单元中。

我认为您无法一次生成所有的块,同时满足您的所有要求。可以生成每个块并检查其是否不重叠:

随机导入
宽度=100#m
高度=70#n
块大小=12#t
块数=15#k
块=[]
而len(块)
要可视化:

导入matplotlib.pyplot作为plt
从matplotlib.patches导入矩形
ax=plt.gca()
对于块中的块:
ax.添加补片(矩形(块、块大小、块大小、,
颜色=(random.random(),random.random(),random.random()))
ax.set_xlim(0,宽度)
ax.set_ylim(0,高度)
plt.show()

请注意,如果没有空间插入额外的块,这种类型的解决方案可能会失败(永远运行)。

有趣的问题。一种方法是随机挑选k个种子细胞,然后随机挑选其中一个进行扩增

另一个考虑因素是区块应遵循什么分布?

给出了一个统一的随机样本,但它有两个相关问题:

  • 它可能会被卡住并永远运行。当它选择的块到目前为止没有空间容纳更多的块时,就会发生这种情况,因此不可能有更多的非冲突块放置
  • 这可能需要很长时间。当有空间容纳更多的块时,就会发生这种情况,但只有一小部分位置是非冲突的,因此需要花费大量时间生成随机冲突位置并拒绝它们
  • 如果kT^2比mn小,那么这两个问题都不会对您造成影响。但在任何情况下,第二个问题都可以被消除(这将使事情全面加速),第一个问题可以被检测并用于回溯或重新启动(这将无限循环转变为可能缓慢但有限的循环)

    为了消除第二个问题,我们的想法是,不要选择一个随机(x,y)位置并测试它是否与现有块放置冲突,而是只保留一个非冲突(x,y)位置的列表,并在其中随机选择,然后从该数组中删除所有现在已成为冲突的位置。让我们使用块左上角的坐标表示块放置,并使用(int,int)对的数组
    validLocations
    来保存列表

  • 最初,将
    validLocations
    设置为包含所有服从x
  • 在每次迭代中:
  • 如果
    validLocations
    为空,请从头开始重新启动或回溯。(在这种情况下,伍德福德的算法将永远循环。)
  • 否则,请在此数组中随机选择一个索引。我们知道该位置的坐标对(Rx,Ry)是块的有效位置
  • 将(Rx,Ry)添加到块放置列表中
  • 有效位置
    中删除所有不再有效的坐标对。也就是说,移除所有对(x,y),以使abs(Rx-x)

  • 这不会产生所有可能的随机采样,因为它会阻止两个块驻留在单个单元中,即使