【问题标题】:Generating a discrete random subwindow from a given window从给定窗口生成离散随机子窗口
【发布时间】:2012-12-04 15:56:49
【问题描述】:

我正在开发一个图像处理应用程序,我遇到的问题是我想从给定窗口生成一个随机子窗口。例如,给定一个 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 窗口等)。

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

谢谢!

【问题讨论】:

    标签: algorithm random probability


    【解决方案1】:

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

    一般来说,对于一个x∙y窗口,有(x-m+1)(y-m+1)个大小为的子窗口>m∙m.

    推荐算法:

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

    编辑:

    其实你可以做得更好。

    • 有 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 )

    高度相同。

    【讨论】:

    • 是的,这也差不多是我的想法。它确实要求您对每个可能的窗口大小进行一些(相当快速的)计算,但我认为这绝对是获得“正确”答案的更快方法。我希望有一些接近封闭形式的解决方案,但我可能会选择这个。
    【解决方案2】:

    我将把它放在这里,即使它不太正确,因为我的模拟表明它很接近,也许我们可以找出缺陷所在。如果无法修复,我会删除它:

    
    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 位置开始。子区域大小的分布具有正确的递减形状,但过于陡峭(5x5 的 100,000 次迭代):

    1 2 3 4 5 0.60427 0.24523 0.10356 0.03875 0.00819

    【讨论】:

    • 我认为问题在于,如果您选择 (Px,Py) 使它们靠近左上角,那么您将遇到与我最初相同的问题:您将很多“大窗户”可供选择。如果您碰巧选择了靠近右下角的 (Px,Py),那么您更有可能选择较小的窗口。有趣的方法,但我认为它不“正确”。
    • 不要删除它!我认为把这些东西留在身边让其他人看是件好事。感谢您试一试!
    • 问题是我实际上遇到了相反的问题——太多的小区域。我的子区域中有 60% 最终是大小为 1 的,而提议的分布为 45%。
    • 抱歉,是的,我在脑海中倒退了……嗯……需要重新考虑。
    • 这个怎么样:我们知道“左上角”在图像中分布不均匀。例如,对于可能的最大窗口,唯一可能的左上角值可以是 (0,0)。 “左上角”的权重主要集中在 具有 位于图像的左上角以适合窗口。如果你调整你的算法,让它选择窗口的“中心”,然后尝试从那里找到一个窗口大小,会发生什么?
    猜你喜欢
    • 2019-12-17
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多