Мне нужно было расставить приоритеты по другим вещам, поэтому, хотя я действительно написал код, мне не удалось написать об этом. Во всяком случае…
Я еще не реализовал настоящий алгоритм, надеюсь, я сделаю это завтра или на Пасху. Я занимаюсь двумя вещами: визуализацией и рефакторингом. Давайте сначала избавимся от скучной части (рефакторинга), а затем посмотрим на визуализацию и проблемы, которые у меня были с ней.
Рефакторинг был очень негламурным. Я поместил настройку задачи в отдельный класс и написал несколько функций класса для ее построения, применения апертуры и т.д. и т.п. Это сократило основную программу до следующего:
import ProblemSetup ps = ProblemSetup.ProblemSetup()
Здесь ProblemSetup — это класс, содержащий, как вы уже догадались, установку проблемы.
Класс выглядит следующим образом. Для ясности я удалил почти весь код, так как вы можете найти подробности в предыдущих сообщениях в блоге. Здесь я хочу показать структуру.
import numpy as np import matplotlib.pyplot as plt import dcolor class ProblemSetup: def __init__(self, n=100, aperture_form="circle", aperture_size=10, plot=True): self._n = n self._aperture_form = "circle" self._aperture_size = 10 self._plot = True # Set up for plotting of dcolor image self.dc = dcolor.dcolor() ## Create aperture ... see earlier blog post ... self._start_guess = np.random.randn(n, n) if self._plot: self.plot_setup() def apply_aperture(self, matrix): return np.multiply(matrix, self._aperture) def apply_fft(self, matrix): return np.fft.fftshift(np.fft.fft2(matrix)) def plot_setup(self): ... plotting stuff ...
Не то, чтобы фантазии, но это работает.
Но теперь к приятной части! Визуализация. До сих пор я наносил на график величину БПФ, но на самом деле нам нужна фаза волны. В конце концов, это называется задачей фазовой реконструкции.
Существует способ красивого построения сложных функций и матриц, который заключается в использовании раскраски предметной области. Это создает красочные и информативные изображения, поэтому я решил попробовать! И я нашел библиотеку python и для этого, так что же может пойти не так?
Ну, видимо много, и что еще хуже: проблему я так и не решил. Я внес небольшие изменения в код библиотеки dcolor, чтобы она могла принимать комплекснозначные матрицы, а затем построил график, надеясь получить красивый график волны.
И я получил один! Вроде…
Это не должно так выглядеть. Почему-то фаза сильно меняется от одного пикселя к другому.
То же самое происходит со случайным стартовым предположением.
Много чего перепробовал, ничего полезного не дало. Пока я не изменил размер изображения туда и обратно. И внезапно!
Мне кажется, что происходит какое-то сглаживание. На данный момент я не совсем уверен, является ли это проблемой алиасинга или алиасинг решил проблему. Надо будет посмотреть на это в ближайшие дни. Этот график не нужен для алгоритма, его лучше иметь.
В любом случае, я продолжу завтра, и, надеюсь, к тому времени проблема с алиасингом решится сама собой…