首先,这是我的代码:

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]=...这行中,您的范围为xy,唯一要绘制的像素是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()


尽管结果还不是一个很好的曼德布罗特...

python - 尝试绘制Mandelbrot集-无论如何,始终获得纯黑图像-LMLPHP

使用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")


瞧,出现了一个真正的曼德布罗特:

python - 尝试绘制Mandelbrot集-无论如何,始终获得纯黑图像-LMLPHP

10-08 03:56