首先,这是我的代码:
from PIL import Image as im
import numpy as np
def mandelbrot_iteration(c):
iters = 0
while abs(c)<2 and iters<200:
c=c**2+c
iters+=1
return iters
HEIGHT = 400
WIDTH = 500
diag = im.new('L',(WIDTH, HEIGHT))
pix = diag.load()
x_pts = np.arange(-2,2,4/WIDTH)
y_pts = np.arange(-2,2,4/HEIGHT)
for x in x_pts:
for y in y_pts:
pix[x+2,y+2]=mandelbrot_iteration(complex(x,y))
diag.save("Fractal.png")
我认为这很简单。我看到复数网格上的每个点要经过多少个交点才能经过abs。值为2,并在每个点上将这些值绘制为颜色(假设顺序不发散,则200为截止值)。在指定的范围内,肯定会有一些不平凡的事情发生,但是无论我尝试什么,所制作的图像都是纯黑色的。
同样,这种生成图像的方法的文档几乎为零。我搜索了很多,这:
im.load()
分配图像的存储并从文件(或从文件
源,用于延迟操作)。通常情况下,您不需要
调用此方法,因为Image类自动加载打开的
首次访问时的图片。
(1.1.6中的新增功能)在1.1.6及更高版本中,load返回一个像素访问对象
可用于读取和修改像素。访问对象的行为
像二维数组一样,因此您可以执行以下操作:
pix = im.load()打印pix [x,y] pix [x,y] =值
通过此对象进行访问比getpixel和putpixel快得多
我能找到的所有信息(也没有任何示例),这非常令人沮丧。我认为pix [x + 2,y + 2]行有问题。 “ +2”可以阻止“超出范围”错误,但是,尝试了一些示例之后,我不知道输入数字如何生成颜色。我确实发现创建图像时的“ L”应生成灰度图像,但不知道pix [x,y]期望的范围是什么。一切都变黑了...
最佳答案
紧迫的问题是您的秤不可用。
在pix[x+2,y+2]=...
这行中,您的范围为x
和y
,唯一要绘制的像素是0..4
。由于最后绘制的几个像素为黑色,因此左上角的整个4x4正方形为黑色(对于新图像,其余均为0,默认为黑色)。
可以这样解决:
from PIL import Image as im
import numpy as np
def mandelbrot_iteration(c):
iters = 0
while abs(c)<2 and iters<200:
c=c**2+c
iters+=1
return iters
HEIGHT = 400
WIDTH = 500
diag = im.new('L',(WIDTH, HEIGHT))
pix = diag.load()
x_pts = np.arange(-2,2,4.0/WIDTH)
y_pts = np.arange(-2,2,4.0/HEIGHT)
for x in x_pts:
for y in y_pts:
pix[WIDTH*(x+2)/4.0,HEIGHT*(y+2)/4.0]=mandelbrot_iteration(complex(x,y))
diag.show()
尽管结果还不是一个很好的曼德布罗特...
使用hcs的注释“ mandelbrot迭代应为z = 0,而abs(z)
from PIL import Image as im
import numpy as np
def mandelbrot_iteration(c):
iters = 0
z = 0
while abs(z)<2 and iters<200:
z=z**2+c
iters+=1
return iters
HEIGHT = 400
WIDTH = 500
diag = im.new('L',(WIDTH, HEIGHT))
pix = diag.load()
x_pts = np.arange(-2,2,4.0/WIDTH)
y_pts = np.arange(-2,2,4.0/HEIGHT)
for x in x_pts:
for y in y_pts:
pix[WIDTH*(x+2)/4.0,HEIGHT*(y+2)/4.0]=mandelbrot_iteration(complex(x,y))
# diag.show()
diag.save("Fractal.png")
瞧,出现了一个真正的曼德布罗特: