Как уже упоминалось в других ответах, дифракция привела к нерезкости. Чтобы проверить это, можно попытаться повысить резкость изображения, используя деконволюцию, используя функцию разброса точек, соответствующую F / 29. Для дифракции имеем (до общей нормализации)
P (s) = {J 1 [π rs / ( λF )] / [π rs / ( λF )]} 2
, где J 1 - это функция Бесселя первого рода порядка 1 ,
с - расстояние в изображении, измеренное в пикселях,
r - размер одного пикселя (обычно около 4,2 * 10 ^ (- 6) метров для датчиков обрезки),
λ - длина волны света, а
F номер F, в данном случае 29.
Тогда это верно для монохроматического света, чтобы аппроксимировать функцию рассеяния точки для цветовых каналов, которую мы можем усреднить в некотором подходящем диапазоне длин волн. Кроме того, следует интегрировать P (s) по области пикселя, указанной в s.
Если мы скомпилируем 3 функции разброса точек для 3 цветовых каналов, то таким образом мы можем повысить резкость изображения, преобразовав его в линейное цветовое пространство и применив алгоритм деконволюции, а затем преобразовав обратно в sRGB. Я получил следующий результат:
Таким образом, лицо было значительно обострено, используя только данные о F-числе и предположение о размере пикселя. В темной части изображения видны полосатые артефакты, это связано с постеризацией после преобразования обратно в sRGB.
По запросу я добавлю еще некоторые подробности об используемых программах. Я использовал ImageJ и ImageMagick , я также использовал Mathematica для вычисления функции разброса точек, но это также можно сделать в ImageJ. Я начну с объяснения того, как я делаю деконволюцию с ImageJ, когда у меня уже есть функция разброса точек. Чтобы выполнить деконволюцию, вам нужно установить плагин для ImageJ, Я использовал этот плагин для этого случая, но есть и другие доступные плагины, например. плагин DeconvolutionLab .
Во-первых, вам нужно преобразовать в линейное цветовое пространство, я использовал ImageMagick для преобразования нерезкого изображения (input.jpg) в линейное цветовое пространство с помощью команды:
convert input.jpg -colorspace RGB output.tif
Затем с ImageJ вы открываете файл output.tif. Затем в опциях меню вы выбираете «изображение», затем «цвет», а затем «Spit Channels». Затем в меню выберите «Плагины», а затем «Параллельная итеративная деконволюция», а затем «2-я Интерактивная деконволюция».
Затем вы получаете окно деконволюции, затем выбираете изображение, а «PSF» означает функцию разброса точек, там вы выбираете файл изображения, который содержит функцию разброса точек. Для метода я выбираю «WPL», который основан на фильтре Винера, который обычно работает достаточно хорошо для изображений с низким уровнем шума. В опциях для WPL установите флажок «нормализовать PSF», и для фильтра нижних частот измените значение на 0,2, по умолчанию оно равно 1, но более низкое значение лучше для изображений с низким уровнем шума (если вы выберете его больше, вы получу изображение, которое менее резкое). Другие опции, Граница может быть выбрана, чтобы быть рефлексивной, изменение размера может быть установлено на «следующую степень 2», выход может быть установлен на 32 бита, точность может быть установлена в два раза. Я выбрал максимальное количество итераций, равное 15, и количество потоков устанавливается автоматически, вам нужно проверить, действительно ли на вашем компьютере указано указанное количество потоков (в моем случае это 8, четырехъядерный процессор, каждый из которых имеет 2 темы).
Затем вы запускаете программу, нажав «deconvolve». Затем вы получите 32-битный файл изображения в качестве вывода. Обычно значения пикселей очень похожи на те, что были на исходном изображении, но у вас может быть несколько пикселей, которые превышают максимум для исходного формата изображения. Итак, в данном случае мы начали с 8-битных изображений, но на деконволюционном изображении вы можете иметь значения серого, превышающие 255, что приводит к тому, что все изображение становится слишком темным. Это должно быть исправлено путем обрезки этих пикселей до 255, что можно сделать, выбрав в меню «Обработка», затем «Математика» и затем «Макс». Максимальное значение будет использовано для обрезки серых значений, которые превышают это значение. Обратите внимание, что это будет сделано с изображением, на котором вы последний раз щелкнули. Вы также можете увидеть, какой файл является «текущим файлом», выбрав в меню «окно», затем вы увидите список всех открытых изображений, и перед одним из них стоит флажок.
Затем, после того как вы разобрали 3 цветовых компонента, вы можете объединить их, выбрав в меню «изображение», затем «цвет», а затем «объединить каналы». Затем вы получаете составное изображение, которое можно преобразовать в 8-битный RGB с помощью команды «Stack to RGB», которую вы там найдете.
Затем сохраните это изображение, назовем его im.tif. Наконец, вы должны преобразовать это в sRGB, вы можете сделать это с помощью ImageMagick с помощью команды:
convert im.tif -set colorspace RGB -colorspace sRGB output.tif
Остается вопрос, как получить функцию разброса точек. На практике, если бы вы сделали снимок, подобный обсуждаемому здесь, вы могли бы просто сфотографировать точечный источник, например звезда в F / 29 и использовал это в качестве функции разброса точек. Кроме того, вы можете посмотреть на границы с высокой контрастностью и извлечь функцию разброса точек по тому, как значения серого меняются от одного значения к другому через границу. Но затем вы пытаетесь сделать изображение как можно лучше.
В этом случае цель состояла в том, чтобы скомпилировать функции разброса точек для цветового канала на основе того, что вы ожидаете, что это будет для F / 29, деконволюции изображения с этим и посмотреть, будет ли результат улучшен достаточно хорошо. Я использовал Mathematica для выполнения некоторых вычислений, и в такой продвинутой программе компьютерной алгебры довольно легко выполнять всевозможные манипуляции, включая усреднение по интервалу длин волн и интеграцию по областям пикселей, чтобы сделать PSF более реалистичным.
Но ImageJ также позволяет вам создавать новое изображение, которое вы можете использовать в качестве функции разброса точек. Если вы нажмете «Файл», а затем «Новый», вы сможете создать 32-битное изображение размером, скажем, 64 на 64, заполненное черным. Затем вы можете запрограммировать формулу для значений серого, выбрав «process», затем «Math», а затем «Macro». Чтобы получить функцию разброса точек для этого случая, которая включает здесь функцию Бесселя, вы можете использовать тот факт, что она хорошо описана в первых нескольких терминах разложения в ряд. Страница MathWorld, на которую я ссылался, дает вам расширения этой серии, так что J 1 (x) 2 / x 2 с x = π rs / ( λF ) можно заменить функцией вида A + B s 2 + C s 4 . Это приближение станет недействительным, если s слишком велико. Теперь мы знаем, что PSF стремится к нулю, например, на расстоянии около 5 или 6 пикселей он может быть установлен на ноль. Предполагая, что полином все еще мал при этих значениях, вы можете записать макрос как:
if(d<7) v = A + B * pow(d,2) + B * pow(d,4)
Затем вы создаете 3 изображения для, скажем, лямбда = 650 нм, 500 нм и 400 нм или любых других значений, которые вы считаете подходящими для представления дифракции в 3 цветовых каналах. Затем вы можете выполнить усреднение по нескольким разным длинам волн, создавая изображения для разных лямбд, затем выбирая «процесс», затем «калькулятор изображений», и там вы выбираете «добавить». Затем вы можете добавить другое изображение к этому результату, и когда вы закончите добавление, вы можете разделить, чтобы получить среднее значение, выбрав «процесс», затем «математика» и затем «разделить».