2

以前、turtle を使用して Python でマンデルブロー生成器を作成しました。現在、速度を上げて画像サイズの制限を減らすために、Python Imaging Library を使用するようにプログラムを書き直しています。

ただし、以下のプログラムはRGBナンセンスのみを出力し、ほとんどノイズです。NumPy と PIL が配列を処理する方法の違いと関係があると思います。なぜなら、とが実行されたときにl[x,y] = [1,1,1]whereが1 ピクセルを白くするだけでl = np.zeros((height,width,3)) はないからです。img = Image.fromarray(l)img.show()

def imagebrot(mina=-1.25, maxa=1.25, minb=-1.25, maxb=1.25, width=100, height=100, maxit=300, inf=2):
    l,b = np.zeros((height,width,3), dtype=np.float64), minb

    for y in range(0, height):
        a = mina
        for x in range(0, width):

            ab = mandel(a, b, maxit, inf)

            if ab[0] == maxit:
                l[x,y:] = [1,1,1]

            #if ab[0] < maxit:
                #smoothit = mandelc(ab[0], ab[1], ab[2])
                #l[x, y] = colorsys.hsv_to_rgb(smoothit, 1, 1)

            a += abs(mina-maxa)/width
        b += abs(minb-maxb)/height

    img = Image.fromarray(l, "RGB")
    img.show()

def mandel(re, im, maxit, inf):
    z = complex(re, im)
    c,it = z,0

    for i in range(0, maxit):
        if abs(z) > inf:
            break
        z,it = z*z+c,it+1
    return it,z,inf

def mandelc(it,z,inf):
    return (it+1-log(log(abs(z)))/log(2))

更新 1:

このプログラムの主なエラーの 1 つ (間違いなくたくさんあると思います) は、複素係数として x,y 座標を使用していたことに気付きました! つまり、-1.25 から 1.25 ではなく、0 から 100 です! これを変更して、コードが変数 a,b を使用してそれらを記述し、タートル バージョンのコードの一部から盗んだ方法でインクリメントします。上記のコードはそれに応じて更新されています。Smooth Coloring Algorithm コードは現在、デバッグ用にコメントアウトされているため、inf変数2のサイズが縮小されています。

更新 2:

優れたユーザーの助けを借りて、numpy インデックスを編集しました。200 x 200 に設定すると、プログラムはこれを出力します。

失敗したマンデルブロ

ご覧のとおり、間違いなく数学的な形状を示していますが、これらすべての奇妙な赤、緑、青のピクセルで満たされています! なぜこれらがここにあるのでしょうか?[1,1,1]私のプログラムでは、RGB 値をdefault に設定するか、そのままにしておくことしかできません[0,0,0]。そんなはずない[1,0,0]- これは重大な欠陥に違いない.

更新 3:

NumPy と PIL の統合にエラーがあると思います。makel = np.zeros((100, 100, 3))を記述l[0,0,:] = 1して最後にimg = Image.fromarray(l)&を指定すると、次のimg.show()ようになります。

1 つの白いピクセルだけではありません。

ここでは、一連の色付きのピクセルを取得します。これには別の質問が必要です。

更新 4:

以前に何が起こっていたのかわかりませんが、np.uint8配列のようで、0 ~ Image.fromarray()255 の色の値を使用しています。この知恵のおかげで、私はこのマンデルバグの理解に一歩近づきました!

今、私漠然と数学的なものを手に入れましたが、それでも奇妙なものを出力します。

白い背景の黒い円。

このドットだけがすべてです... に変更するとnp.uint16、さらに奇妙なことがわかります。これは、バイト形状とエンコード方式が異なるためだと思います。

4

1 に答える 1

4

3D 配列 l のインデックスが間違っています。試してください

l[x,y,:] = [1,1,1]

代わりは。numpy 配列にアクセスして変更する方法の詳細については、numpy indexingを参照してください。

補足として: numpy のクイックスタート ドキュメントには、実際にはマンデルブロ集合の生成とプロットの実装が含まれています。

于 2017-01-07T19:44:44.920 に答える