试图绘制Mandelbrot集 - 无论如何,总是得到纯黑色图像

时间:2016-09-18 21:03:41

标签: python python-imaging-library

首先,这是我的代码:

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()print pix [x,y] pix [x,y] = value

     

通过此对象访问比getpixel和putpixel

快得多

我能找到的所有(没有任何例子),这非常令人沮丧。我想像pix [x + 2,y + 2]这条线是错的。 '+ 2'可以阻止“超出范围”的错误,但是,在尝试了一些例子后,我不知道输入数字是如何产生颜色的。我确实发现创建图像时“L”应该生成灰度图像,但不知道pix [x,y]的预期范围是什么。一切都变黑了......

1 个答案:

答案 0 :(得分:2)

当前的问题是您的比例已关闭。

在这一行Task<StorageFile>中,您的pix[x+2,y+2]=...x范围内的唯一像素是y。由于最后绘制的几个像素是黑色,因此整个左上角的4x4正方形为黑色(其余为0 - 也为黑色 - 默认情况下为新图像)。

可以这样解决:

0..4

虽然结果还不是很好的Mandelbrot ......

mandelsmorgasbord

使用hcs'注释“mandelbrot迭代应该是z = 0,而abs(z)&lt; 2,z = z ** 2 + c”应用,你将使用此代码

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()

然后看到一个真正的Mandelbrot弹出:

Correct Mandelbrot