我正在渲染一个mandelbrot设置并且已经实现了一些平滑的着色,但是当仔细观察时,图片变得非常嘈杂。我想知道,改善我的色彩以获得更好的美学效果的最佳方法是什么。使用直方图着色有助于消除粗糙的像素化区域吗? Here is a render of the fractal using 10 000 iterations.
这就是我现在正在生成和分配颜色的方式:
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"));
答案 0 :(得分:0)
思考循环,如果结束值在一个循环中达到起始值,并且你有几个循环。
通过创建水平伽玛来测试它,例如颜色的|||| ... |||
。
类似的东西:
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;
}
}
}
}
答案 1 :(得分:0)
对评论而言太过分了,但不是一个明确的答案,对不起。
您可以轻松地在轮廓广泛传播的地方制作平滑的颜色分度,但在M-Set(“无限”迭代)附近,图像变得明显混乱,相邻像素具有非常不同的迭代次数,因此看起来很吵。当创建缩放时,这更加明显,并且嘈杂区域似乎“跳舞”。
我发现最好的解决方案是在这些区域使用灰度,基于8个相邻像素的迭代差异。假设“无限”区域是黑色的,那么在邻居中存在大多数变化或者某些邻居在M-Set上的情况下,这样的灰色像素将是最黑的。在较浅的一侧,当有一些相同深度的邻居时,我会从中获得一些色调。在没有邻居具有相同深度的中间地带,灰色的阴影将基于它们的变化。
我使用了C和汇编程序(用于迭代)。
答案 2 :(得分:0)
一个可以产生可接受结果的简单解决方案就是使用2x2,3x3或4x4超级采样进行抗锯齿处理,并通过平均4,9或16块的颜色值(而不是迭代计数)来生成每个像素像素。
这种方法只是一种通用的图像渲染技术,它没有使用Mandelbrot分形的任何特定知识来解决问题,但是你可以通过计算相邻整个像素的迭代次数来优化它,并且只做子如果计数不完全相同,则采样步骤。这意味着您只会在重要的位置进行:在2次迭代计数之间的边界处或在彼此相邻的许多不同计数的嘈杂区域中。
您可以通过生成测试图像,然后通过图像编辑应用程序中的比例因子缩小测试图像来测试这一点(确保已打开过滤)。如果它看起来不错,那么你可以通过在现有的内部像素循环中为每个子像素添加额外的几个for循环来实现它,将 c 递增1/2,1 / 3或1 / 4像素步骤。添加颜色值并除以适当的数量。