当前位置: 首页 > 知识库问答 >
问题:

Mandelbrot平滑着色算法的最佳选择是什么

龙永福
2023-03-14

我正在渲染一个mandelbrot集,并且已经实现了一些平滑的着色,但是当仔细观察时,图片变得非常嘈杂。我想知道,为了达到更好的美感,改善我的色彩的最好方法是什么。使用直方图着色是否有助于去除粗糙的像素区域?这里是一个使用10000次迭代的分形渲染。

这是我现在生成和分配颜色的方式:

            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            int black = 0;
            int[] colors = new int[max]; //max is the maximum number of iterations
            for (int i = 0; i<max; i++) {
                colors[i] = Color.HSBtoRGB(i/256f, 1, i/(i+8f));
            }
            for(int i = 0; i < colors.length / 2; i++)
            {
                int temp = colors[i];
                colors[i] = colors[colors.length - i - 1];
                colors[colors.length - i - 1] = temp;
            }

           ...
           ...
           ...

                    if (iterations < max) image.setRGB(col, row, colors[iterations]);
                    else image.setRGB(col, row, black);
                }
            }

            //ImageIO.write(image, "png", new File("mandelbrot_seeria90"+Integer.toString(i)+".png"));
            ImageIO.write(image, "png", new File("resotest.png"));

共有3个答案

归翔
2023-03-14

对于评论来说太多了,但不是一个明确的答案,抱歉。

在轮廓广泛分布的地方,可以很容易地进行平滑的颜色分级,但在M集(“无限”迭代)的附近,图像明显变得混乱,相邻像素的迭代次数非常不同,因此看起来很嘈杂。当创建缩放时,这一点更加明显,嘈杂的区域似乎在“跳舞”。

我发现最好的解决方案是根据8个相邻像素的迭代差异,在这些区域使用灰度。假设“无限”区域为黑色,则在相邻区域变化最大的地方,或在M-集上的某些相邻区域,此类灰色像素将是最黑的。在较浅的一面,当有相同深度的邻居时,我会从他们那里获得一些色调。而在没有邻居具有相同深度的中间地带,灰色的阴影将基于它们的变化。

我使用C和汇编语言(用于迭代)。

邴和雅
2023-03-14

想想循环,如果结束值在一个循环中达到开始值,你有几个循环。

通过创建一个水平伽马来测试它,比如颜色的||||...||

比如:

fill:
for (int i = 0; i < max; ) {
    for (int h = 0; h < NH; ++h) {
        float hValue = ((float)h) / NH;
        for (int b = 0; b < NB; ++b) {
            doublebValue = ((double)b) / NB; // 0 .. 1
            bValue = Math.sin(2 * Math.PI  * bValue); // -1 .. 1
            bValue = (2 + bValue) / 3; // 0.33 .. 1
            colors[i] = Color.HSBtoRGB(hValue, 1, (float) bValue);
            ++i;
            if (i >= max) {
                break fill;
            }
        }
    }
}
潘佐
2023-03-14

产生可接受结果的简单解决方案是使用2x2、3x3或4x4超级采样消除混叠,并通过平均4、9或16像素块的颜色值(而不是迭代计数)来生成每个像素。

这种方法只是一种通用的图像渲染技术,它没有使用任何具体的Mandelbrot分形知识来解决这个问题,但是你可以通过计算邻近整个像素的迭代计数来优化它,并且只在计数不是全部的情况下执行子采样步骤一样。这意味着您将只在重要的地方执行它:在2个迭代计数之间的边界,或者在有许多不同计数相邻的嘈杂区域。

您可以通过生成一个测试图像,然后在图像编辑应用程序中将其缩小一个比例因子来测试这一点(确保启用了过滤)。如果它看起来正常,那么您可以通过在现有的内部像素循环中为每个子像素添加一对额外的for循环来实现它,将c增加像素步长的1/2、1/3或1/4。将颜色值相加并除以适当的值。

 类似资料:
  • 我知道关于这件事,阿雷迪回答了很多问题。然而,我的略有不同。无论何时我们实现平滑着色算法,我都理解它。 其中n是逃逸迭代,2是z的幂,如果我没有弄错,z是该逃逸迭代处复数的模。然后,我们在颜色之间的线性插值中使用这个重整化的逃逸值来生成平滑的带状mandelbrot集。我已经看到了关于这个的其他问题的答案,我们通过HSB到RGB的转换来运行这个值,但是我仍然无法理解这将如何提供平滑的颜色渐变,以及

  • 我用python编程了Mandelbrot集,但看起来很奇怪,所以我搜索平滑的颜色。我用对数和线性插值编程了一个平滑的着色函数,但是无论我尝试什么,我都得不到我想要的: 这是我的调色板 这里是我的着色功能 这是我得到的 正如你所看到的那样,平滑的颜色是没有连续性的 我想要这样的东西: 理想结果 我们看不到色差

  • 我已经尝试了很多算法来渲染Mandelbrot集,包括简单的逃逸时间算法,以及优化的逃逸时间算法。但是,有没有更快的算法可以像我们在YouTube上看到的那样有效地产生真正深的缩放。此外,我很想得到一些想法,如何提高我的精度超过C/C

  • 问题内容: 是否有人在使用LINQ to MySQL的实用程序?你知道哪一个最好吗? 到目前为止,我知道用于NHibernate的LINQ和DBLinq 问题答案: 还有LINQ to LLBLGEN,它可以支持许多数据库。 从LLBLGEN的功能页面 支持SQL Server(MSDE,SQL Server 7/2000/2005 / Express,SQL CE 2.0、3.0、3.5),SQ

  • 我制作了一个程序来计算mandelbrot集合中的点。对于不属于mandelbrot集的点,我会记录起点发散到震级大于2的地方所需的迭代次数。基本上,对于mandelbrot集合之外的每一点,我都有一个计数器,可以显示它在1到256的范围内发散的速度。我想做的是根据每个点发散的速度给它一个颜色。例如,在255次迭代中发散的点可能是白色的,发散越快,着色越多。我已经做了一个简单的调整,在20步以上的

  • 我试图沿着一条线插值颜色,这样,给定两个点及其各自的RGB值,我就可以绘制一条具有平滑颜色渐变的线。使用Bresenham的线条算法,我现在可以绘制线条,但不知道如何开始在两个endpoint之间插值颜色。以下是适用于斜率小于1的所有线条的DrawLine()函数的一部分。 所以我想的是,就像画线一样,我也需要某种决策参数p来确定何时改变RGB值。我在想,随着x的增加,看看每一个rgb值,决定我是