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

Algorithm 从给定窗口生成离散随机子窗口,algorithm,random,probability,Algorithm,Random,Probability,我正在开发一个图像处理应用程序,我有一个问题,我想从给定的窗口生成一个随机子窗口。例如,给定一个5x5(像素)窗口,我想在x,y的给定位置生成一个子窗口,具有给定的宽度和高度。目前,可以假定子窗口的宽度和高度始终相等。但是,原始窗口没有此约束 目前,我只是为子窗口生成一个随机的宽度/高度,我知道它适合原始窗口的内部。然后我生成一个有效的x,y坐标,它允许子窗口适应原始窗口。当前方法的问题在于,它不尊重这样一个事实,即较小的窗口更丰富,因此更容易出现。通过为子窗口宽度/高度选择一个随机维度,我假设

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

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

谢谢!

谢谢你的邀请∙n窗口,有(n-m+1)个尺寸为m²的子窗口∙m

一般来说,对于x∙y窗口,有大小为m的(x-m+1)(y-m+1)子窗口∙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层(sqrt(2r-1.75)-0.5)

高度也一样。

我将把它放在这里,尽管它不太正确,因为我的模拟显示它很接近,也许我们可以确定缺陷是什么。如果无法修复,我将删除它:


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

1) 在1到X上生成一个Px离散单形
2) 在1到Y上生成一个离散均匀的Py
3) 设Rx=X-Px+1,设Ry=Y-Py+1
4) 设A=Rx*Ry——我们可以填充的剩余区域
5) 在1:min(Rx,Ry)上生成离散均匀的S

(Px,Py),(Px+S,Py),(Px,Py+S),(Px+S,Py+S)将定义该区域的坐标
基本上,我只是选择子区域的左上角,然后随机选择一个allowbale正方形子区域大小,因为我的子区域从Rx,Ry位置开始。子区域大小的分布具有正确的递减形状,但过于陡峭(100000次5x5迭代):

1 2 3 4 5 0.60427 0.24523 0.10356 0.03875 0.00819
是的,这也是我的想法。它确实需要你在每个可能的窗口大小上做一些(相当快的)计算,但我认为这绝对是一个更快的方法来得到“正确”的答案。我希望有一个接近封闭形式的解决方案,但我可能会这样做。我认为问题是,如果你选择(Px,Py)使它们接近左上角,那么你会遇到和我最初一样的问题:你将有很多“大窗口”可供选择。如果您碰巧选择了靠近右下角的(Px,Py),那么您更有可能选择较小的窗口。有趣的方法,但我不认为它是“正确的”。而且不要删除它!我认为把这些东西留给别人看是件好事。谢谢你试一试!事实上,我遇到了相反的问题——太多的小区域。我60%的分区最终都是1号分区,而45%的分区都是建议的分区。对不起,是的,我是在我的脑子里倒过来想的。。。隐马尔可夫模型。。。需要重新思考。这是怎么回事:我们知道“左上角”在图像中的分布并不均匀。例如,对于可能的最大窗口,唯一可能的左上角值可以是(0,0)。“左上角”的权重很大,必须位于图像的左上角才能使窗口适合。如果调整算法,使其选择窗口的“中心”,然后尝试从中查找窗口大小,会发生什么情况? 1 2 3 4 5 0.60427 0.24523 0.10356 0.03875 0.00819