Как упоминалось в других ответах, дифракция привела к нерезкости. Чтобы проверить это, можно попытаться повысить резкость изображения, используя деконволюцию, используя функцию разброса точек, соответствующую F / 29. Для дифракции имеем (до общей нормализации)
P (s) = {J 1 [π rs / ( λF )] / [π rs / ( λF )]} 2
где J 1 - функция Бесселя первого рода порядка 1 ,
s - расстояние в изображении, измеренное в пикселях,
r - размер одного пикселя (обычно около 4,2 * 10 ^ (- 6) метров для датчиков обрезки),
λ представляет собой длину волны света, а
Р диафрагменное число, в данном случае 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». Затем в меню выберите «Плагины», а затем «Параллельная итеративная деконволюция», а затем «2D Интерактивная деконволюция».
Затем вы получаете окно деконволюции, затем выбираете изображение, а «PSF» означает функцию разброса точек, там вы выбираете файл изображения, который содержит функцию разброса точек. Для метода я выбираю «WPL», который основан на фильтре Винера, который обычно работает достаточно хорошо для изображений с низким уровнем шума. В опциях для WPL установите флажок «нормализовать PSF», и для фильтра нижних частот измените значение на 0,2, по умолчанию оно равно 1, но более низкое значение лучше для изображений с низким уровнем шума (если вы выберете его больше, вы получу изображение, которое менее резкое). Другие опции, Граница может быть выбрана, чтобы быть рефлексивной, изменение размера может быть установлено на «следующую степень 2», выход может быть установлен на 32 бита, точность может быть установлена в два раза. Я выбрал максимальное количество итераций, равное 15,
Затем вы запускаете программу, нажав «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 цветовых каналах. Затем вы можете выполнить усреднение по нескольким разным длинам волн, создавая изображения для разных лямбд, затем выбирая «процесс», затем «калькулятор изображений», и там вы выбираете «добавить». Затем вы можете добавить другое изображение к этому результату, и когда вы закончите добавлять, вы можете разделить, чтобы получить среднее значение, выбрав «процесс», затем «математика», а затем «разделить».