Я пытаюсь разработать изображение, фокусирующее алгоритм для некоторой работы автоматизации тестирования. Я принял решение использовать AForge.net, так как это походит на хороший сформировавшийся .NET дружественная система.
К сожалению, я, может казаться, не нахожу информацию о создании алгоритмов автофокуса с нуля, таким образом, я дал ему свою лучшую попытку:
возьмите изображение. примените sobel граничный фильтр обнаружения, который генерирует полутоновую граничную схему. генерируйте гистограмму и сохраните стандарт dev. камера перемещения один шаг ближе, чтобы подвергнуть и сделать другой снимок. если стандарт dev меньше, чем предыдущий, мы добираемся больше в фокусе. иначе мы имеем мимо оптимального расстояния для снимания.
существует ли лучший путь?
обновление: ОГРОМНЫЙ дефект в этом, между прочим. поскольку я заканчиваю оптимальный фокус, мое "изображение в фокусе" значение продолжает расти. Вы ожидали бы функцию параболического выхода, смотрящую distance/focus-value, но в действительности Вы получаете что-то, что это более логарифмически
обновление 2: хорошо, таким образом, я вернулся к этому и существующему методу, мы исследуем, дан несколько известных краев (хорошо, таким образом, я знаю точно, что объекты в изображении), я делаю ручное сравнение интенсивности пикселей. поскольку получающийся график становится более крутым, я добираюсь больше в фокусе. Я отправлю код, после того как основной алгоритм портирован от matlab в c# (да, matlab..:S)
обновление 3: обновление финала yay. возвратился к этому снова. заключительный код похож на это:
шаг 1: получите изображение из списка изображений (я сделал сто фотографий через сфокусированную точку),
шаг 2: найдите край для объекта, который я фокусирую (В моем случае, это - прямоугольный объект, это всегда находится в том же месте, таким образом, я обрезаю ВЫСОКИЙ и УЗКИЙ прямоугольник одного края),
шаг 3: получите HorizontalIntensityStatistics (класс Aforge.net) для того кадрированного изображения.
шаг 4: получите Гистограмму (серый в моем случае)
шаг 5: найдите производную значений гистограммы
шаг 6: то, когда Ваш наклон является самым большим, когда Вы находитесь в наиболее сфокусированной точке.
Это может быть немного упрощенным для ваших потребностей, но у меня были хорошие результаты с простым алгоритмом, который смотрит на разницу в соседние пиксели. Сумма разницы пикселей 2-гона, кажется, разумная мера контрастности изображения. Я не мог найти оригинальную бумагу Бреннером в 70-х годах, но он упоминается в http://www2.die.upm.es/im/papers/autofocus.pdf
Другой проблемой, когда изображение Чрезвычайно не в фокусе, есть очень мало фокусировки информации, поэтому трудно сказать, какой путь «движется ближе» или избежать локального максимума.
Это может быть полезно. Это то, как работает система AF камеры на самом деле работает - Пассивный автофокус
измерение контрастности
измерение контрастности достигается путем Измерение контрастности в датчике Поле, через объектив. Интенсивность разница между соседними пикселями Датчик, естественно, увеличивается с Правильный фокус изображения. Оптически система может быть скорректирована до Максимальная контрастность обнаружена. В Этот метод AF не включает в себя фактическое измерение расстояния вообще и как правило, медленнее, чем фаза Системы обнаружения, особенно когда работает под тусклом светом. Как это делает не использовать отдельный датчик, однако, AUTOFOCUS CONTRAST-DESTECT может быть больше гибкий (как это реализовано в программное обеспечение) и потенциально больше точный. Это общий метод в видеокамеры и уровень потребителей цифровые камеры, которые не хватает жалюзи и Рефлекторные зеркала. Некоторые DSLR (в том числе Olympus E-420, Panasonic L10, Nikon D90, Nikon D5000, Nikon D300 в штативе Режим, Canon EOS 5D Mark II, Canon EOS 50d) Используйте этот метод при фокусировке в их режимы в реальном времени. Новый Система взаимозаменяемой линзы, микро Четыре трети, исключительно использует контраст измерение автофокуса, и говорят, что Предложение производительности, сопоставимые с фазой обнаруживать системы.
Интересно, является ли стандартное отклонение лучшим выбором: если изображение получает острее, изображение фильтра SOBEL будет содержать более яркие пиксели по краям, но в то же время меньше ярких пикселей, потому что к краям становится разбавитель. Может быть, вы можете попробовать использовать в среднем на 1% самых высоких значений пикселей в изображении SOBEL?
Я сам не построил, но моя первая мысль будет делать 2D DFT на порции изображения. Когда вне фокуса высокие частоты исчезнут автоматически.
Для ленивого прототипа вы можете попытаться сжать область изображения с JPEG (высокое качество) и посмотрите на размер выходного потока. Большой файл означает много деталей, что, в свою очередь, подразумевает изображение в фокусе. Остерегайтесь, что камера не должна быть слишком шумной, и что вы не можете сравнить размеры файлов на разных сценах конечно.
Хотя собель является достойным выбором, я, вероятно, решил бы сделать расчет величины краев на проекциях в направлениях x и y в нескольких небольших репрезентативных областях. Другой .NET дружественный выбор, основанный на OpenCV - это @ http://www.emgu.com/wiki/index.php/Main_Page.