Python 给定大小为m*n的输入图像X和大小为T的块,如何生成大小为T*T的k个随机非重叠块?
在阅读报纸时,我提出了以下问题: 给定大小为mn、块大小为T的输入图像X,生成大小为TT的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_
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个块
- 选择并不是分布在所有可能的地方
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个种子细胞,然后随机挑选其中一个进行扩增 另一个考虑因素是区块应遵循什么分布?给出了一个统一的随机样本,但它有两个相关问题:
validLocations
来保存列表
validLocations
设置为包含所有服从xvalidLocations
为空,请从头开始重新启动或回溯。(在这种情况下,伍德福德的算法将永远循环。)有效位置
中删除所有不再有效的坐标对。也就是说,移除所有对(x,y),以使abs(Rx-x)这不会产生所有可能的随机采样,因为它会阻止两个块驻留在单个单元中,即使