Як було сказано в інших відповідях, дифракція призвела до нерізкості. Щоб поставити це на тест, можна спробувати заточити зображення за допомогою деконволюції, використовуючи функцію точкового розвороту, що відповідає 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. Потім з параметрів меню ви вибираєте "зображення", потім "колір", а потім "Плюйте канали". Потім у меню виберіть "плагіни", а потім "паралельну ітераційну деконволюцію", а потім 2d інтерактивну деконволюцію ".
Потім ви отримуєте вікно деконволюції, потім вибираєте зображення, а "PSF" означає fucntion поширення точки, там ви вибираєте файл зображення, який містить функцію поширення точки. Для методу я вибираю "WPL", який базується на фільтрі Вінера, який зазвичай працює досить добре для зображень із низьким рівнем шуму. В параметрах для WPL встановіть прапорець "нормалізувати PSF", а для фільтра низьких частот змініть значення на 0,2, за замовчуванням - 1, але нижнє значення краще для зображень із низьким рівнем шуму (якщо ви виберете його більше, ви ' Ви отримаєте менш чітке зображення). Інші параметри, границя може бути обрана як рефлексивна, зміна розміру може бути встановлена на "наступна потужність 2", вихід може бути встановлений на 32 біт, точність може бути встановлена вдвічі. Я вибрав кількість максимальних ітерацій, що дорівнює 15,
Потім ви запускаєте програму, натиснувши на "деконвельвати". Потім ви отримаєте 32-бітний файл зображення як вихід. Зазвичай значення пікселів досить подібні до того, що вони були у вихідному зображенні, але ви можете мати пікселі, що перевищують максимальний для вихідного формату зображення. Так, у цьому випадку ми розпочали з 8-бітових зображень, але у деконційованому зображенні ви можете мати значення сірого кольору, що перевищують 255, а потім все зображення стає занадто темним. Це потрібно виправити, відрізавши ці пікселі до 255, що можна зробити, вибравши в меню "процес", а потім "Математику", а потім "Макс". Максимальне значення буде використане для відсікання сірих значень, що перевищують це значення. Зауважте, що це буде зроблено з зображенням, яке ви останнім чином натиснули на нього. Ви також можете побачити, який файл є "поточним файлом", вибравши "
Після того, як ви відключили 3 кольорові компоненти, ви можете їх об'єднати, вибравши в меню "зображення", потім "колір", а потім "Об'єднати канали". Потім ви отримуєте складене зображення, яке ви можете перетворити на 8-бітний RGB за допомогою команди «Стек у RGB», яку ви знайдете там.
Потім ви збережете це зображення, назвемо його ім.tif. Нарешті, ви повинні перетворити це в sRGB, ви можете зробити це за допомогою ImageMagick за допомогою команди:
convert im.tif -set colorspace RGB -colorspace sRGB output.tif
Залишилося питання, як отримати функцію розведення точки. На практиці, якби ви сфотографували подібну до обговорюваної тут, ви могли просто сфотографувати точковий джерело, наприклад, зірку у F / 29 і використати це як функцію розведення точки. Крім того, ви можете переглянути високі межі контрасту та витягнути функцію поширення точок із того, як значення сірого кольору змінюються від одного значення до іншого через межу. Але тоді ви намагаєтеся чіткіше зобразити зображення.
У цьому випадку метою було скласти функції розподілу точок для кольорового каналу, виходячи з того, що ви очікували б, що це буде для F / 29, відключити зображення до цього і побачити, чи результат виглядає досить добре, що це. Я використовував Mathematica, щоб зробити деякі обчислення, і в такій передовій програмі комп’ютерної алгебри досить просто робити всілякі маніпуляції, включаючи усереднення через інтервал довжини хвилі та інтеграцію по піксельних областях, щоб зробити PSF більш реалістичним.
ImageJ також дозволяє створити нове зображення, яке ви можете використовувати як функцію поширення точки. Якщо натиснути "Файл", а потім "Створити", ви можете створити 32-бітове зображення розміром, скажімо, 64 на 64, заповнене чорним кольором. Потім можна запрограмувати формулу сірих значень, вибравши "обробити", потім "Математика", а потім "Макрос". Щоб отримати функцію розведення точки в цьому випадку, яка включає тут функцію Бесселя, ви можете використовувати той факт, що він добре описаний першими кількома умовами розширення рядів. Сторінка 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 кольорових каналах. Потім ви можете виконати усереднення за декількома різними довжинами хвилі, створивши зображення для різної лямбда, а потім виберіть "обробити", потім "калькулятор зображення", і там ви вибрали "додати". Потім ви можете додати до цього результату ще одне зображення, і коли ви закінчите додавати, ви можете розділити, щоб отримати середнє значення, вибравши "обробити", потім "математику", а потім "розділити".