我正在尝试实施buddhabrot fractal。我无法理解一件事:我检查的所有实现都会在图像上选择随机点来计算粒子逃逸的路径。他们为什么这样做呢?为什么不重温所有像素?
随机点的目的是什么?更多的点可以产生更好的图像,所以我认为遍历所有像素会产生最佳图像 - 我在这里错了吗?
从我的测试数据:
使用400x400图片。如果我全身心投入,那么要迭代160 000个像素。
使用随机抽样, 图片仅在100万点后开始形成。好的结果显示大约10亿个随机点,需要几个小时来计算。
答案 0 :(得分:32)
随机抽样优于网格抽样有两个主要原因。首先,因为网格采样将在结果图像中引入类似网格的伪像。其次是因为网格采样可能无法为聚合的结果图像提供足够的样本。如果在完成网格传递后,您需要更多样本,则需要使用稍微偏移的网格进行另一次传递(以便不重新采样相同的点)或切换到更精细的网格,这可能最终完成比需要更多的工作。随机采样可以得到非常平滑的结果,您可以在图像收敛后立即停止该过程,或者您对结果感到满意。
我是这项技术的发明者,所以你可以相信我。 : - )
答案 1 :(得分:3)
同样适用于火焰分形:佛陀要发现“吸引子”, 因此,即使您从一个随机点开始,也可以很快地收敛到这些吸引曲线。您通常会避免在迭代中绘制前10个像素,或者无论如何,因此起点并不真正相关,但是,为避免两次进行相同的计算,随机采样要好得多。如上所述,它消除了人工制品的风险。
但随机抽样的最重要特征是它具有所有精确度(理论上至少)。这对于分形来说非常重要:它们具有各种精度水平的细节,因此也需要来自所有级别的输入。
答案 2 :(得分:1)
虽然我并非100%意识到确切原因,但我认为它更多地与效率有关。如果你要多次遍历每一个点,那么就会浪费大量的处理周期来获得可能看起来不那么好的图片。通过随机抽样,您可以减少需要完成的工作量 - 并且如果样本量足够大,仍然会得到难以“区分”迭代所有像素的结果(从视觉角度来看)。
答案 3 :(得分:0)
这可能是某种Monte-Carlo method所以是的,覆盖所有像素会产生完美的结果,但会非常费时。
为什么不试试看看会发生什么?
答案 4 :(得分:0)
随机抽样用于尽可能接近精确解,在这种情况下,由于问题的统计性质,无法精确计算。
你可以'遍历所有像素',但由于每个像素实际上都是维度为dx * dy的方形区域,因此您只能使用num_x_pixels * num_y_pixels点进行计算,并获得非常粗糙的结果。
另一种方法是使用非常大的分辨率并在计算后按比例缩小渲染。这将提供某种“系统”渲染,其中最终渲染的每个像素被分成相等数量的子像素。