2

Раньше я создал генератор Мандельброта на питоне с использованием черепахи. Теперь я переписываю программу для использования библиотеки изображений Python, чтобы увеличить скорость и уменьшить ограничения на размер изображений.При построении Мандельброта с использованием NumPy & Pillow программа выводит кажущийся шум

Однако программа ниже выводит только RGB, почти шум. Я думаю, что это связано с различием в том, как NumPy и PIL имеют дело с массивами, поскольку говорят l[x,y] = [1,1,1], где l = np.zeros((height,width,3))не просто делают 1 пиксель белого цвета, когда выполняются 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)) 

UPDATE 1:

я понял, что одна из главных ошибок в этой программе (я уверен, что есть много) является то, что я использовал х, у COORDS в качестве комплексных коэффициентов ! Итак, от 0 до 100 вместо -1,25 до 1,25! Я изменил это, так что теперь код использует переменные a, b для их описания, увеличиваясь таким образом, что я украл некоторые из моего кода в версии черепахи. Соответствующий код был соответствующим образом обновлен. Поскольку в настоящее время код Smooth Coloring Algorithm закомментирован для отладки, переменная inf была уменьшена до 2.

UPDATE 2:

я редактировал Numpy индекс с помощью от большого пользователя. Теперь программа выводит это при установке 200 на 200:

Failed Mandelbrot

Как вы можете видеть, это определенно показывает некоторую математическую форму, и все же наполнен всеми этими странными красными, зелеными и синими пикселей! Почему они здесь? Моя программа может устанавливать только значения RGB в [1,1,1] или оставить это по умолчанию [0,0,0]. Это не может быть [1,0,0] или что-нибудь подобное - это должно быть серьезным недостатком ...

UPDATE 3:

Я думаю, что есть ошибка с интеграцией Numpy и PIL в. Если я l = np.zeros((100, 100, 3)), а затем состояние l[0,0,:] = 1 и, наконец, img = Image.fromarray(l) & img.show(), это то, что мы получаем:

Not just 1 white pixel!

Здесь мы получаем серию цветных пикселей. Этот вопрос содержит.

UPDATE 4:

Я понятия не имею, что происходит раньше, но, кажется, с np.uint8 массива, Image.fromarray() использует цветовые значения 0-255. С этой мудростью я двигаюсь на один шаг ближе к пониманию этого Мандельбуга!

Теперь, я do получить что-то неопределенно математическое, однако оно все еще выводит странные вещи.

Black circle in White Background.

Эта точка все есть ... я даже странные вещи, если я изменяю np.uint16, я полагаю, из-за различных байт-формы и кодирования схемы.

+0

Обычно избегает итерации Мандельброта, когда величина комплексного значения превышает '2' не' 10 ** 100'. –

+0

Да, я понимаю, почему это может показаться необычайно странным. Это потому, что я использую Smooth Coloring Algorithm, чтобы цвет каждого пикселя. Для этого требуется очень большой «горизонт» порядка 10 ** 100. –

+0

Интересно. Я не могу дать ссылку на «когда величина достигает 2, значение функции в конечном итоге исчезнет» (возможно, в соавторстве «Наука фрактальных изображений» Б. Б. Мандельброт). Но дело в том, что на более низких итерационных участках (где функция ускользает) контуры являются гладкими, поэтому итерация в дальнейшем является ненужной. Он находится только вблизи границы M-Set (рядом с максимальными итерациями), где мой рендеринг изображений выглядит хаотичным. Имеет ли повышенная ценность эвакуации? Я не работал над Mset в течение нескольких лет, поэтому не могу сразу проверить это. –

ответ

3

Вы индексацию 3D массив л неправильно, попробуйте

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

вместо этого. Для получения дополнительной информации о том, как получить доступ и изменить массивы numpy, смотрите numpy indexing

В качестве примечания стороны: номер quickstart documentation numpy на самом деле имеет реализацию генерации и построения набора мандельбротов.

+0

Спасибо, что указали это. Кажется, это приблизило меня к шагу! Однако программа по-прежнему не правильная - я посмотрю на ссылку, которую вы мне дали, и хотя она использует matplotlib, я уверен, что это будет полезно. Во всяком случае, я исправил другие вещи и обновил сообщение, вкратце объяснив исправления. –

+0

Функция matplotlib [plt.imshow()] (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.imshow) делает практически то же самое, что и метод PIL .show(): Если данный массив является 3-мерным, а последнее измерение имеет размер 3 (например, ваш массив l), он будет интерпретировать его и показывать его как изображение RGB. – AlessioM

+0

У меня недостаточно репутации, чтобы прокомментировать ваш вопрос, но чтобы добавить к вашему обновлению сообщение о том, что вам не нужно присваивать l [x, y ,:] массив: это правда, это функция numpy, называемая [широковещательная передача] (https://docs.scipy.org/doc/numpy/user/basics .broadcasting.html), причем особым случаем является назначение скаляра, такого как l [x, y ,:] = 10 (это установит l [x, y, 0] == l [x, y, 1] = = l [x, y, 2] == 10) – AlessioM