从给定窗口生成离散随机子窗口

时间:2012-12-04 15:56:50

标签: algorithm random probability

我正在处理一个图像处理应用程序,我遇到的问题是我想从给定窗口生成一个随机子窗口。例如,给定5x5(像素)窗口,我想在x,y的给定位置生成具有给定宽度和高度的子窗口。目前,可以假设子窗口的宽度和高度始终彼此相等。但是,原始窗口没有此约束。

目前,我只是为子窗口生成随机宽度/高度,我知道它适合原始窗口。然后我生成一个有效的x,y坐标,允许该子窗口适合原始窗口。当前方法的问题在于它不尊重较小的窗口更丰富并因此更可能发生的事实。通过为子窗口宽度/高度选择随机尺寸,我假设它们在宽度和高度方面的分布是均匀的,而事实上并非如此。

例如,假设我们获得了一个5x5的窗口。有25个可能的1x1子窗口,16个可能的2x2窗口,9个可能的3x3窗口,4个可能的4x4窗口和1个可能的5x5窗口。因此,我应该选择一个概率约为0.45(25 /(25 + 16 + 9 + 4 + 1)的1x1窗口,一个概率约为0.29的2x2窗口等。

我不确定如何在没有暴力评估所有可能的窗口的情况下从正确的分布中快速生成这样的允许子窗口,然后只需从列表中选择一个,但我相当有一个更聪明的方法来做到这一点,我只是不知道从哪里开始。

谢谢!

2 个答案:

答案 0 :(得分:3)

对于 n∙n 窗口,有(n-m + 1)²子窗口大小 m∙m

通常,对于 x∙y 窗口,有(x-m + 1)(y-m + 1)子窗口大小米∙米

建议的算法:

  • 对于每个 m ,计算子窗口的数量;构建这些值的数组。
  • 对数组中的值求和,并在此范围内生成均匀分布的整数
  • 将此整数映射到相关的子窗口大小(使用value-map或range-map)

修改

实际上你可以做得更好。

  • 有1个宽度为x的子窗口,2个子窗口,宽度为(x-1),...,x 子窗口,宽度为(x-(x -1))。总的来说,宽度/水平位置有(1 + 2 + 3 + ... + x)= x(x + 1)/ 2 可能的选项。
  • [1,x(x + 1)/ 2] 范围内生成均匀分布的整数 r
  • 使用以下公式确定宽度: w = x-floor(sqrt(2r-1.75)-0.5)

相同的高度。

答案 1 :(得分:1)

我会把它放在这里,即使它不太正确,因为我的模拟显示它是接近的,也许我们可以弄清楚这是什么缺陷。如果无法修复,我会将其删除:


1) Generate an Px discretely uninform on 1 to X
2) Generate a Py discretely uniform on 1 to Y
3) let Rx = X - Px + 1, let Ry = Y - Py + 1
4) Let A = Rx * Ry - the remaining area we can fill
5) Generate S discretely uniform on 1:min(Rx,Ry)

(Px,Py), (Px+S,Py),(Px,Py+S),(Px+S,Py+S) would define the coordinates of the region

基本上我只选择子区域的左上角然后随机选择一个允许的方形子区域大小,因为我的子区域从Rx,Ry位置开始。次区域大小的分布具有正确的缩小形状,但它太陡(100,000次迭代5x5):

1       2       3       4       5
0.60427 0.24523 0.10356 0.03875 0.00819