![](http://habrastorage.org/files/f47/70e/46e/f4770e46e95e402a9c73be48e49bb56f.jpg)
Слева — «сырые» кадры с устройства. Справа — обработка.
В этой статье постараюсь добиться максимального качества макроснимка от типичного usb-микроскопа. Такие устройства – не предназначены для получения художественных фотографий. Их задача — позволить быстро и легко рассмотреть мелкие детали предмета. Однако я постараюсь специальными условиями съемки, постобработкой и некоторыми другими способами отчасти нивелировать эти недостатки.
Статья написана «Just for Fun» и по сути является рассказом о пути поиска лучшего результата. Не стоит рассматривать ее как рекомендацию. Если вам нужна хорошая макрофотография — лучше всего воспользоваться для этого специальной аппаратурой.
USB-микроскоп
Все макроснимки в статье сделаны используя USB-микроскоп, предоставленный компанией Даджет (за что им большое спасибо!).
Само по себе устройство микроскопа достаточно типично для устройств этого класса. Web-камера закрепленная на подставке оснащена набором из 8 светодиодов для подсветки снимаемого объекта, и двумя поворотными дисками для регулировки фокуса и степени освещенности.
Микроскоп устанавливается на стол, включается подсветка, и под объектив кладется исследуемый предмет. После чего необходимо навести фокус, и с помощью программы из комплекта поставки — сделать снимок или записать видео. Фотографии сохраняются в формате jpg, а видео в формате avi (без сжатия).
Так как статья об этом устройстве уже публиковалась на geektimes.ru (рекомендую ознакомиться, в статье много классных фотографий и сравнений) то я не буду больше повторяться описывая само устройство и его функционал.
Для целей этой статьи достаточно знания того, что внутри устройство представляет собой web-камеру с дополнительным модулем подсветки и регулировки фокуса. Позволяет в реальном времени просматривать на компьютере изображение с увеличением в 20-200 раз, и имеет разрешение матрицы 1600*1280 пикселей.
Остальные характеристики устройства особого значения не имеют, но я еще скажу о нем несколько слов в конце статьи.
Часть 0. Снимок.
Итак, первым делом необходимо получить изображение для обработки. Для этого можно воспользоваться стандартным приложением «MicroCapture» входящим в комплект поставки? Или любым другим, позволяющем захватывать кадры с web-камеры.
![](http://habrastorage.org/files/399/e25/b60/399e25b6043b40419fada8d35538211a.jpg)
В качестве тестового изображения я использовал кусочек ткани, на нем хорошо заметны все типы артефактов.
Все кадры в статье я буду сохранять с разрешением 1600*1280 пикселей, так как это «родное» разрешение камеры. Использовать другое разрешение не имеет смысла, если мы хотим получить максимальное качество фотографий, т.к. алгоритмы интерполяции уничтожат часть информации и затруднят работу с шумами.
Посмотрим полученное изображение в 100% масштабе.
![](http://habrastorage.org/files/aaa/dea/70c/aaadea70cbb147df864e1162e4b2cf27.jpg)
Видно что фотография сильно зашумлена. Начнем.
Часть первая. Динамический шум.
Каким образом можно убрать шум с фотографии?
Шумы возникают из-за недостатка чувствительности матрицы. Можно представить (хоть это не совсем верно), что чувствительность, это просто коэффициент на который умножаются все данные пришедшие с матрицы. Понятно, что чем меньше света пришло на матрицу из за закрытой диафрагмы или короткой выдержки – тем на большее число нужно будет умножить данные с матрицы для того чтобы сохранить приемлемую яркость итоговой картинки, и тем больше будут заметны погрешности работы матрицы – т.е. шум.
Чтобы уменьшить шум – нужно понизить ISO (чувствительность), а для этого – либо больше открыть диафрагму, либо увеличить выдержку.
Но тут мы сталкиваемся и техническим ограничением – у данной web-камеры, как и у большинства других – чувствительность матрицы вообще не изменяется. Диафрагма – нерегулируемая, а выдержка – просто регулирует количество света. И именно ее меняет программа подстраиваясь под уровень освещенности.
Можно усилить внешнюю подсветку – но тогда придется сократить выдержку. Можно уменьшить подсветку – тогда выдержка увеличиться. В любом случае, фактическое количество света на матрице будет равным и соответственно шумы будут всегда одинаковыми (в темноте света недостаточно и сигнал с камеры просто умножается на коэффициент усиления, что приводит к еще большим шумам).
Итак. Мы не можем увеличить выдержку средствами камеры, значит остается делать это в обход нее. К примеру, можно сохранить несколько кадров, а потом склеить их в один, найдя среднее арифметическое для каждого пиксела. А еще лучше записать видео, из сотен кадров… Попробуем:
![](http://habrastorage.org/files/0f1/3f0/bd7/0f13f0bd7c8746b692b0e661ac2762dc.jpg)
Изображение стало однозначно лучше, практически исчез «мелкий» шум. Но качество по-прежнему оставляет желать лучшего, остались яркие точки (3 из них выделены на рисунке желтыми полосками).
![](http://habrastorage.org/files/0bf/633/a00/0bf633a001614c44aca8e85ad22c3a7f.gif)
Дело в том, что шум создается случайными отклонениями от цвета который матрица считает «правильным». Но для дешевых матриц которые ставят в web-камеры – это «правильное» значение может быть ошибкой. Иными словами, математическое ожидание отклонений не стремиться к нулю.
Это можно легко увидеть если «склеить» ровную картинку, например, полностью расфокусировав изображение, чтобы не мешали лишние детали.
![](http://habrastorage.org/files/5ad/7b6/8a7/5ad7b68a7569462e9d3e2c21fbc71f6c.jpg)
Один кадр. По клику — оригинал
![](http://habrastorage.org/files/233/eed/85f/233eed85f825475db27ba18d642b25d3.jpg)
Среднее из 200 кадров. Яркость увеличена в 2 раза, для наглядности.
Как видим шумы очень значительны. Некоторые пиксели вообще битые, другие образуют полосы и зоны искаженной цветопередачи. Если удаленный шум можно назвать динамическим, то этот – постоянный, или статический. Попробуем снять и его.
Статический шум
Первая мысль – можно использовать полученное выше изображение для коррекции кадра. Просто вычтем из изображения средний цвет и прибавим серый и увеличим контраст в 2 раза. В итоге получим изображение, наложив которое на любой кадр – мы отчасти сократим помехи.
Подобный принцип используется при постобработке в некоторых камерах, но в целом — это плохое решение. Битые пиксели – это отсутствие информации, и что бы мы на них не накладывали – информация ниоткуда не возьмется.
Частично рабочие пиксели – вызывают в лучшем случае сокращение динамического диапазона цветов, а в худшем – полное искажение цвета.
Другое решение – «распределить» влияние каждого пикселя матрицы по нескольким пикселям итогового изображения. Этого можно добиться если смещать снимаемый объект в небольших пределах, а потом «склеить» изображения учитывая смещения. Так чтобы каждая точка объекта представлена была только в одном пикселе совмещенного изображения.
Двигая кусочек ткани руками я получил такое изображение:
![](http://habrastorage.org/files/81b/2de/401/81b2de40194e47d395be3eae4aa1cdc6.gif)
Для того чтобы склеить такие кадры – нужно вначале «стабилизировать» изображение, добиться полной неподвижности. Это можно сделать проанализировав движение, например, с помощью OpenCV, но я пошел по более простому пути – выполнив трекинг в сторонней программе.
После трекинга в AE, и «склейки» кадров моей утилитой – получим такой результат.
![](http://habrastorage.org/files/82d/0b5/b64/82d0b5b6416342ea96be0780cb47fa0e.jpg)
Заметно что шума нет, но появилось неприятная смазанность, вызванная тем, что при смещении изображение дрожало и размывалось.
Попробуем определить степень размытости изображения, чтобы исключить из склейки смазанные кадры. Для этого я пошел самым простым путем – вычислял сумму разницы между всеми соседними пикселями изображения. Чем более смазано изображение – тем более близки по цвету соседние пиксели, а значит общая сумма модулей разности – даст некую оценку размытости кадра. График размытости по тестовой выборке будет выглядеть так:
Хорошо видны зоны где я двигал изображение, и оно размазывалось (график в этих местах на несколько кадров опускается вниз). Отсекая смазанные кадры можно немного улучшить картинку, но значительного изменения не будет, движения слишком резкие. Я хотел еще улучшить результат, поэтому пошел дальше.
Автоматизация
Предпосылкой к дальнейшему явилось то, что у меня случайно оказался шаговый двигатель 28BYJ-48. Пусть лучше он двигает объект перед микроскопом. Для теста вполне достаточно сделать простой вращающийся рабочий стол.
Преимущества в отсутствии смазывания, и возни с дрожаниями, уходящим фокусом и т.п. Конечно удобнее всего закрепить двигатель прямо к микроскопу, для чего пришлось распечатать крепление, состоящее из трех фрагментов:
![](http://habrastorage.org/files/84d/ad6/fd3/84dad6fd3bdf490fb1e90c895b8e646b.jpg)
Но даже в таких условиях трекинг далеко не идеальный. При увеличении становится существенным rolling shutter и перспективные искажения, что приводит к искривлению картинки которые невозможно решить трекингом (пришлось переключиться на трекинг в Mocha, но всех проблем это не решило). Отчасти проблемы можно нивелировать если сравнивать все кадры последовательности с первым, и при наличии существенных отклонений — просто не учитывать этот кадр.
Для типичной последовательности график исключений выглядит так:
![](http://habrastorage.org/files/cae/b19/3e9/caeb193e93ff478d8ea8d2cefb6dd2d2.gif)
Видно, что со временем разброс накапливается, т.к. каждый кадр сравнивается с первым. Также заметны резкие скачки, эти точки соответствуют ошибкам трекинга.
Итогом работы стали изображения:
Огорчает малая глубина резкости, но это тоже поправимо. Пусть с оговорками, но склеить из нескольких изображений с разной точкой фокуса, одно, с большей глубиной резкости вполне возможно.
Результат:
![](http://habrastorage.org/files/d41/27c/224/d4127c224d0e4454a4df80d21cf453b9.jpg)
![](http://habrastorage.org/files/dcf/1e1/49a/dcf1e149a8624c9c9d3092024bd91a01.jpg)
Все изображения кликабельны.
А вот пример работы на обычном объекте (золото сережке).
![](http://habrastorage.org/files/8d4/e5a/426/8d4e5a426ed04e5b96808633b0cc0dac.jpg)
Обработка.
Заключение
В эксперименте использовался «Цифроскоп» предоставленный компанией Даджет.
ссылка на оригинал статьи http://geektimes.ru/post/249662/
Добавить комментарий