Давайте зберемо кліща-мозгоеда під мікроскопом або focus-stacking фотографій з консолі


Сподіваюся, цей пост не стане причиною нічних кошмарів у особливо чутливих хабрачитателей. У цьому пості я постараюся розповісти про простому способі збільшення ГРИП. Це досить актуальна проблема для тих, хто працює з мікроскопом і займається макрофотографией. Суть проблеми в тому, що на великих збільшеннях розмиття віддалених від точки фокуса предметів стає великою проблемою. Це в традиційній портретній зйомці розмиття фону дозволяє підкреслити об'єкт. У науковій мікрофотографії це найчастіше негативний ефект. Радує, що є методика focus-stacking, яка дозволяє пов'язати в єдину різку картинку стопку фотографій з різною точкою фокусування. Але вистачить міркувати про абстрактне. Внесіть кліща в студію!

Якщо його не видно, це не означає, що він не їсть тебе прямо зараз

Все почалося досить тривіально. Моя улюблена фатсхедера почала стрімко чахнути і всіляко намагатися померти незважаючи на догляд. Так як я працюю в секретному проекті по створенню хедкрабов лабораторії, то у мене є доступ до мікроскопів та іншим цікавим залізяк. Потряс я листочок над предметним склом і побачив цілі легіони чарівних створінь, які намагалися уползті від яскравого світла подалі. Вирішив я зробити фотографію на пам'ять перед масовим геноцидом, але зіткнувся з проблемою глибини різкості. Мало того, що це тварина мляво ворушилося навіть залитий спиртом, так ще й було надто об'ємним, щоб влізти в різку зону разом. Виглядало це приблизно ось так:

Треба було щось придумувати для отримання різкого зображення.

Z-stacking

Я звернувся до традиційною методикою зшивання серії фотографій, але був неприємно здивований цінами на комерційні продукти. Особливо, якщо це від виробника мікроскопа. Там взагалі тихий жах. Але так як ми не даремно користувачів linux і іконку Столман регулярно протираємо від пилу, то будемо шукати вільні програми. Відразу знайшлися Hugin і Enfuse, які дозволяють робити все красиво і з консолі, що дуже зручно при масовій обробці фотографій.
Основні етапи у нас два:
  • (Hugin) Вирівнювання фотографій з контрольним загальним точках
  • (Enfuse) Власне зшивання всього цього воєдино


Enfuse доступний GUI, але ми будемо працювати з консолі. Встановлюємо потрібні пакети під Ubuntu (вони доступні і для Windows, буде відрізнятися синтаксис трохи):
sudo apt-get update && sudo apt-get install enfuse hugin hugin-tools -y


На першому етапі складаємо всі наші зображення в окремий каталог. При необхідності проводимо доведення балансу білого та експозиції з допомогою того ж RawTherapee. Після це вирівнюємо, щоб нівелювати тремтіння камери або в даному випадку легке ворушіння пацієнта:

align_image_stack -v -m --gpu -a aligned -C *.jpg


Зверніть увагу, що ми пробуємо використовувати GPU через OpenCL для розрахунків, що значно швидше, але не завжди працює. Якщо буде падати — приберіть опцію --gpu. Далі, -a aligned створює нові файли з відповідним префіксом. *.jpg — маска для вибору файлів, які будуть вирівнюватися.
В результаті консоль дає нам такий висновок:

Висновок консолі
meklon@RegenLab-LinuxDesktop-1:~/ownCloud/Temp/2016.04 Кліщ хабр/converted$ align_image_stack -v -m -a aligned -C *.jpg Creating control points between Image_299.jpg and Image_300.jpg
Trying to find 8 corners... 
Number of good matches: 0, bad matches: 40
Number of good matches: 1, bad matches: 39
Number of good matches: 2, bad matches: 38
Number of good matches: 4, bad matches: 36
Number of good matches: 5, bad matches: 35
Number of good matches: 1, bad matches: 39
Number of good matches: 2, bad matches: 38
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 6, bad matches: 34
Number of good matches: 7, bad matches: 33
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 1, bad matches: 39
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 3, bad matches: 37
Creating control points between Image_300.jpg and Image_301.jpg
Trying to find 8 corners... 
Number of good matches: 0, bad matches: 40
Number of good matches: 0, bad matches: 40
Number of good matches: 3, bad matches: 37
Number of good matches: 8, bad matches: 32
Number of good matches: 7, bad matches: 33
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 0, bad matches: 40
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 7, bad matches: 33
Number of good matches: 1, bad matches: 39
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 7, bad matches: 33
Number of good matches: 8, bad matches: 32
Number of good matches: 6, bad matches: 34
Creating control points between Image_301.jpg and Image_302.jpg
Trying to find 8 corners... 
Number of good matches: 0, bad matches: 40
Number of good matches: 6, bad matches: 34
Number of good matches: 8, bad matches: 32
Number of good matches: 4, bad matches: 36
Number of good matches: 7, bad matches: 33
Number of good matches: 1, bad matches: 39
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 3, bad matches: 37
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Creating control points between Image_302.jpg and Image_303.jpg
Trying to find 8 corners... 
Number of good matches: 3, bad matches: 37
Number of good matches: 0, bad matches: 40
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 5, bad matches: 35
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 1, bad matches: 39
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 2, bad matches: 38
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Creating control points between Image_303.jpg and Image_304.jpg
Trying to find 8 corners... 
Number of good matches: 3, bad matches: 37
Number of good matches: 0, bad matches: 40
Number of good matches: 3, bad matches: 37
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 1, bad matches: 39
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 3, bad matches: 37
Number of good matches: 1, bad matches: 39
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Creating control points between Image_304.jpg and Image_305.jpg
Trying to find 8 corners... 
Number of good matches: 0, bad matches: 40
Number of good matches: 0, bad matches: 40
Number of good matches: 8, bad matches: 32
Number of good matches: 2, bad matches: 38
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 0, bad matches: 40
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 4, bad matches: 36
Number of good matches: 1, bad matches: 39
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 6, bad matches: 34
Creating control points between Image_305.jpg and Image_306.jpg
Trying to find 8 corners... 
Number of good matches: 2, bad matches: 38
Number of good matches: 0, bad matches: 40
Number of good matches: 8, bad matches: 32
Number of good matches: 2, bad matches: 38
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 0, bad matches: 40
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 1, bad matches: 39
Number of good matches: 8, bad matches: 32
Number of good matches: 2, bad matches: 38
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Creating control points between Image_306.jpg and Image_307.jpg
Trying to find 8 corners... 
Number of good matches: 0, bad matches: 40
Number of good matches: 0, bad matches: 40
Number of good matches: 0, bad matches: 40
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 0, bad matches: 40
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 6, bad matches: 34
Number of good matches: 6, bad matches: 34
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 1, bad matches: 39
Number of good matches: 8, bad matches: 32
Number of good matches: 1, bad matches: 39
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 8, bad matches: 32
Number of good matches: 6, bad matches: 34
Optimizing Variables
Strategy 1
Average (rms) distance between Controlpoints 
after 0 iteration(s): 13.1811221241261 units
Strategy 1
Average (rms) distance between Controlpoints 
after 1 iteration(s): 13.1566720340408 units
Strategy 1
Average (rms) distance between Controlpoints 
after 2 iteration(s): 13.0662076945298 units

Optimizing Variables
Strategy 2
Average (rms) distance between Controlpoints 
after 0 iteration(s): 4.22711068896714 units
Strategy 2
Average (rms) distance between Controlpoints 
after 1 iteration(s): 3.90465178857069 units
Strategy 2
Average (rms) distance between Controlpoints 
after 2 iteration(s): 3.88979141960262 units
Strategy 2
Average (rms) distance between Controlpoints 
after 3 iteration(s): 3.88741946042386 units
Strategy 2
Average (rms) distance between Controlpoints 
after 4 iteration(s): 3.88714333274445 units
Strategy 2
Average (rms) distance between Controlpoints 
after 5 iteration(s): 3.88711661173386 units
Strategy 2
Average (rms) distance between Controlpoints 
after 6 iteration(s): 3.88711414454988 units
Strategy 2
Average (rms) distance between Controlpoints 
after 7 iteration(s): 3.88711391437541 units

Ctrl points before pruning: 1274, after: 1051
Optimizing Variables
Strategy 1
Average (rms) distance between Controlpoints 
after 0 iteration(s): 1.11869477363138 units
Strategy 1
Average (rms) distance between Controlpoints 
after 1 iteration(s): 1.10458154981741 units
Strategy 1
Average (rms) distance between Controlpoints 
after 2 iteration(s): 1.10324670986012 units
Strategy 1
Average (rms) distance between Controlpoints 
after 3 iteration(s): 1.09274711349145 units
Strategy 1
Average (rms) distance between Controlpoints 
after 4 iteration(s): 1.09274711349145 units

Optimizing Variables
Strategy 2
Average (rms) distance between Controlpoints 
after 0 iteration(s): 1.08772087726722 units
Strategy 2
Average (rms) distance between Controlpoints 
after 1 iteration(s): 1.07924785202492 units
Strategy 2
Average (rms) distance between Controlpoints 
after 2 iteration(s): 1.07923206520615 units
Strategy 2
Average (rms) distance between Controlpoints 
after 3 iteration(s): 1.07923200575396 units

Run called
Down to Algorithm
Original Image: 2080x1544
Inner 256 2349312: 128 1952 - 128 1416
Starting 256: 128 1952 - 128 1416
Starting 128: 128 1952 - 128 1416
Starting 64: 0 1952 - 0 1416
Starting 32: 0 2016 - 0 1480
Starting 16: 0 2048 - 0 1512
Starting 8: 0 2064 - 0 1528
Starting 4: 0 2072 - 0 1536
Starting 2: 0 2076 - 0 1540
Starting 1: 0 2078 - 0 1542
Found Solution: 0 0 2079 1543
Crop 0x0 - 2079x1543
Crop Size 2079x1543
Set size to crop 0,0,2079,1543
Multiple images output
loading Image_299.jpg
remapping Image_299.jpg
saving aligned0000.tif
loading Image_300.jpg
remapping Image_300.jpg
saving aligned0001.tif
loading Image_301.jpg
remapping Image_301.jpg
saving aligned0002.tif
loading Image_302.jpg
remapping Image_302.jpg
saving aligned0003.tif
loading Image_303.jpg
remapping Image_303.jpg
saving aligned0004.tif
loading Image_304.jpg
remapping Image_304.jpg
saving aligned0005.tif
loading Image_305.jpg
remapping Image_305.jpg
saving aligned0006.tif
loading Image_306.jpg
remapping Image_306.jpg
saving aligned0007.tif
loading Image_307.jpg
remapping Image_307.jpg
saving aligned0008.tif
Written aligned images to files with prefix "aligned"



Якщо ви фотографуєте макро, що часто спотворюються пропорції предметів на різній фокусуванні. В таких випадках буває, що вырванивание може займати цілу вічність. Спробуйте без нього, хоча результат буде гірше.

image
Тепер зшиваємо всі воєдино за допомогою Enfuse. Основний принцип — виділення найбільш контрастних і різких деталей на кожній картинці для подальшого зшивання. Невелика гало все ж залишається.
Запускаємо:

enfuse -o result.jpg -v --exposure-weight=0 --saturation-weight=0 --contrast-weight=1 --hard-mask *.tif


-o result.jpg — фінальний файл для виводу, *.tif — маска для input. tif — результат висновку попередньої утиліти, але якщо ви сшиваете исходники з іншим розширенням — замініть відповідно.

Приклади зшивання

Я не буду наводити всі фотографії серії, лише кілька для прикладу.
Банку джему:




Спеціальна лабораторна серветка під мікроскопом:




Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.