Автоматизация съемки флуоресценции в мягком УФ: гайд для программиста

Вы когда-нибудь пытались снять флуоресценцию вручную? Это ад. Камера плывет, экспозиция скачет, а на снимке — одно мутное пятно. Я перепробовал кучу способов, пока не автоматизировал процесс. И вот что получилось.
Фотография при флуоресценции в мягком ультрафиолете — это мощнейший инструмент. Криминалистика, геология, биология, реставрация — везде нужны четкие снимки. Но ручная съемка — это лотерея. Нестабильная экспозиция, паразитная засветка, часы обработки. Я покажу, как собрать систему на базе обычной цифровой камеры, управляемой через Python. Вы научитесь контролировать камеру через gPhoto2, подбирать настройки и обрабатывать снимки через OpenCV. Результат — чистые, научно значимые кадры. Без магии. Только код.
Железо: что реально нужно
Для УФ-флуоресцентной съемки нужно три вещи: источник мягкого УФ (365–395 нм), камера с модифицированной матрицей и запирающий фильтр. Вот сравнение популярных вариантов по деньгам и эффективности:
- LED-панель Convoy S2+ UV — 365 нм, 5 Вт, 20–30 у.е. Идеально для старта.
- Лампа Wood's (ртутная) — 365 нм, 12 Вт, 50–80 у.е. Классика, но греется.
- Светодиодный прожектор 395 нм — 395 нм, 50 Вт, 15–25 у.е. Дешево и сердито, но контраст ниже.
Важно: используйте светильники с пиком 365–385 нм. Они дают максимальный контраст. УФ-С (ниже 280 нм) — только в защитном костюме. Камеру можно взять обычную, но для лучшей чувствительности удалите ИК-фильтр и замените его на стекло, пропускающее УФ. Я рекомендую Canon с gPhoto2 — эта связка работает как часы.
Управление: gPhoto2 и Python
Установите gPhoto2 (Linux, macOS, Windows через WSL). Для управления из Python используйте модуль subprocess. Вот базовый скрипт для серии снимков:
import subprocess
import time
def capture_image(filename, config):
cmd = ["gphoto2", "--set-config", f"iso={config['iso']}",
"--set-config", f"shutterspeed={config['shutter']}",
"--set-config", f"f-number={config['aperture']}",
"--capture-image-and-download", "--filename", filename]
subprocess.run(cmd)
config = {
'iso': 800,
'shutter': '2', # 2 секунды
'aperture': '5.6'
}
for i in range(5):
filename = f"fluo_{i:03d}.cr2"
capture_image(filename, config)
print(f"Снят {filename}")
time.sleep(1)
Совет: перед серией сделайте тестовый снимок при минимальной выдержке. Оцените уровень флуоресценции. Выдержка может быть от 0,5 до 30 секунд. Для автоматической настройки экспозиции используйте гистограмму с камеры. Я предпочитаю брекетинг с шагом 1 EV — потом выбираю лучший кадр.
Обработка: OpenCV и магия масок
RAW-файлы конвертируйте в 16-битный TIFF через dcraw или RawTherapee. Дальше — OpenCV и NumPy. Главная задача: убрать неравномерность освещения и подчеркнуть сигналы.
import cv2
import numpy as np
def correct_illumination(image, blur_size=(151,151)):
lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
l_channel, a, b = cv2.split(lab)
# Вычитание размытого фона
blurred = cv2.medianBlur(l_channel, 151)
corrected = cv2.subtract(l_channel, blurred)
corrected = cv2.normalize(corrected, None, 0, 255, cv2.NORM_MINMAX)
lab_corrected = cv2.merge([corrected, a, b])
return cv2.cvtColor(lab_corrected, cv2.COLOR_LAB2BGR)
Для выделения флуоресцирующих участков используйте пороговую обработку по цветовому тону (Hue). Флуоресценция часто имеет характерный оттенок: синий, зеленый, красный. Пример маски по зеленому каналу:
hsv = cv2.cvtColor(img_proc, cv2.COLOR_BGR2HSV)
lower_green = np.array([40, 40, 40])
upper_green = np.array([80, 255, 255])
mask = cv2.inRange(hsv, lower_green, upper_green)
Личное наблюдение автора: Лучшие результаты я получал при съемке с выдержкой 4–8 секунд на ISO 400. Потом складывал несколько кадров (stacking) для подавления шума. Это дает чистую картинку даже без дорогой камеры. Дешево и эффективно.
Практика: как не облажаться
- Штатив и пульт — обязательно. Любые вибрации убивают резкость.
- Калибруйте баланс белого по нейтральному объекту (белая бумага) под тем же освещением.
- Установите запирающий фильтр (UV/IR Cut или желтый) на объектив — уберет остаточный УФ.
- Избегайте перегрева УФ-лампы. Дайте ей прогреться 5 минут перед съемкой.
- Создайте темный бокс из черной ткани. Внешний свет — враг.
Резюме от автора
Автоматизация УФ-флуоресцентной съемки через Python и gPhoto2 — это не rocket science. Это рабочий инструмент. Вы получаете воспроизводимые результаты и обрабатываете большие серии за минуты. Главное — правильно настроить оборудование и подобрать параметры под конкретный вид флуоресценции. Начните с простых скриптов. Постепенно усложняйте pipeline. Добавляйте калибровку и анализ. И да, это работает лучше, чем любой ручной метод. Проверено.













