Мне было интересно, если есть способ определить, является ли изображение размытым или нет, анализируя данные изображения.
203
Мне было интересно, если есть способ определить, является ли изображение размытым или нет, анализируя данные изображения.
Ответы:
Да, это так. Вычислите быстрое преобразование Фурье и проанализируйте результат. Преобразование Фурье говорит вам, какие частоты присутствуют на изображении. Если высоких частот мало, изображение размытое.
Определение терминов «низкий» и «высокий» зависит от вас.
Редактировать :
Как указано в комментариях, если вы хотите, чтобы один float представлял размытость данного изображения, вы должны выработать подходящую метрику.
В ответе ники предоставьте такую метрику. Сверните изображение с лапласовым ядром:
И используйте надежную максимальную метрику на выходе, чтобы получить число, которое вы можете использовать для определения порога. Старайтесь избегать слишком сглаживания изображений перед вычислением лапласиана, потому что вы только обнаружите, что сглаженное изображение действительно размыто :-).
источник
Другой очень простой способ оценить резкость изображения - использовать фильтр Лапласа (или LoG) и просто выбрать максимальное значение. Использование надежного измерения, такого как квантиль 99,9%, вероятно, лучше, если вы ожидаете шума (то есть выбираете N-й самый высокий контраст вместо самого высокого контраста.) Если вы ожидаете, что переменная яркость изображения будет изменена, вам также следует включить этап предварительной обработки для нормализации яркости изображения / контраст (например, выравнивание гистограммы).
Я реализовал предложение Саймона и это в Mathematica и попробовал его на нескольких тестовых изображениях:
Первый тест размывает тестовые изображения с использованием фильтра Гаусса с изменяющимся размером ядра, затем вычисляет БПФ размытого изображения и принимает среднее значение 90% самых высоких частот:
Результат в логарифмическом графике:
5 линий представляют 5 тестовых изображений, ось X представляет радиус фильтра Гаусса. Графики уменьшаются, поэтому БПФ является хорошим показателем резкости.
Это код для оценки размытости с «самым высоким уровнем LoG»: он просто применяет фильтр LoG и возвращает самый яркий пиксель в результате фильтра:
Результат в логарифмическом графике:
Разброс для не размытых изображений здесь немного лучше (2,5 против 3,3), главным образом потому, что этот метод использует только самый сильный контраст в изображении, в то время как БПФ, по сути, представляет собой среднее значение по всему изображению. Функции также уменьшаются быстрее, поэтому может быть проще установить «размытый» порог.
источник
Во время некоторой работы с объективом с автофокусом я наткнулся на этот очень полезный набор алгоритмов для определения фокусировки изображения . Он реализован в MATLAB, но большинство функций довольно легко портировать на OpenCV с помощью filter2D. .
Это в основном обзорная реализация многих алгоритмов измерения фокуса. Если вы хотите прочитать оригинальные статьи, ссылки на авторов алгоритмов приведены в коде. Бумага 2012 года Pertuz, et al. Анализ операторов измерения фокуса для формы от фокуса (SFF) дает большой обзор всех этих показателей, а также их производительности (как с точки зрения скорости и точности применительно к SFF).
РЕДАКТИРОВАТЬ: Добавлен код MATLAB на случай, если ссылка умрет.
Несколько примеров версий OpenCV:
Нет гарантий того, являются ли эти меры лучшим выбором для вашей проблемы, но если вы отследите документы, связанные с этими мерами, они могут дать вам более глубокое понимание. Надеюсь, вы найдете код полезным! Я знаю, что сделал.
источник
Построение ответа Nike. Реализовать метод на основе лапласиана с помощью opencv просто:
Возвращает короткое замыкание, указывающее максимальную обнаруженную резкость, которая, основываясь на моих тестах на реальных образцах, является довольно хорошим показателем того, находится ли камера в фокусе или нет. Неудивительно, что нормальные значения зависят от сцены, но намного меньше, чем метод FFT, который должен иметь высокий уровень ложных срабатываний, чтобы быть полезным в моем приложении.
источник
Я придумал совершенно другое решение. Мне нужно было проанализировать видеокадры, чтобы найти самый резкий кадр в каждом (X) кадре. Таким образом, я бы обнаружил размытие в движении и / или не в фокусе изображения.
В итоге я обнаружил Canny Edge и получил ОЧЕНЬ ОЧЕНЬ хорошие результаты почти с каждым видом видео (при использовании метода nikie у меня были проблемы с оцифрованными VHS-видео и чересстрочными видео).
Я оптимизировал производительность, установив область интереса (ROI) на исходном изображении.
Использование EmguCV:
источник
Спасибо Ники за это замечательное предложение Лапласа. Документы OpenCV указали мне в одном направлении: использование python, cv2 (opencv 2.4.10) и numpy ...
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
numpy.max(cv2.convertScaleAbs(cv2.Laplacian(gray_image,3)))
результат между 0-255. Я обнаружил, что все, что выше 200, очень в фокусе, а к 100 заметно размыто. Максимум никогда не становится намного меньше 20, даже если он полностью размыт.
источник
Один из способов, который я в настоящее время использую, измеряет распространение краев на изображении. Ищите эту статью:
Обычно он платный, но я видел несколько бесплатных копий. По сути, они определяют вертикальные края изображения, а затем измеряют их ширину. Усреднение ширины дает окончательный результат оценки размытия изображения. Более широкие края соответствуют размытым изображениям, и наоборот.
Эта проблема относится к области оценки качества эталонного изображения. . Если вы посмотрите на Google Scholar, вы получите много полезных ссылок.
РЕДАКТИРОВАТЬ
Вот график оценок размытия, полученных для 5 изображений в посте Ники. Более высокие значения соответствуют большей размытости. Я использовал фильтр Гаусса с фиксированным размером 11x11 и изменил стандартное отклонение (используя
convert
команду imagemagick для получения размытых изображений).Если вы сравниваете изображения разных размеров, не забудьте выполнить нормирование по ширине изображения, так как у больших изображений будут более широкие края.
Наконец, серьезной проблемой является различие между художественным размытием и нежелательным размытием (вызванным отсутствием фокуса, сжатием, относительным перемещением объекта к камере), но это выходит за рамки простых подходов, подобных этому. В качестве примера художественного размытия взгляните на изображение Ленны: отражение Ленны в зеркале размыто, но ее лицо идеально сфокусировано. Это способствует более высокой оценке размытия изображения Ленны.
источник
Я попробовал решение на основе фильтра Лапласа из этого поста. Это не помогло мне. Итак, я попробовал решение из этого поста, и это было хорошо для моего случая (но медленно):
Менее размытое изображение имеет максимум
sum
значение!Вы также можете настроить скорость и точность, изменив шаг, например
эта часть
Вы можете заменить этим
источник
Ответы выше объяснили многие вещи, но я думаю, что было бы полезно провести концептуальное различие.
Что если вы сделаете идеально сфокусированное изображение размытого изображения?
Проблема обнаружения размытия хорошо ставится, только если у вас есть ссылка . Если вам необходимо спроектировать, например, систему автоматической фокусировки, вы сравниваете последовательность изображений, полученных с разной степенью размытия или сглаживания, и пытаетесь найти точку минимального размытия в этом наборе. Другими словами, вам нужно сопоставить различные изображения, используя один из методов, показанных выше (в основном - с различными возможными уровнями детализации в подходе - поиск одного изображения с самым высоким высокочастотным контентом).
источник
Код Matlab двух методов, которые были опубликованы в авторитетных журналах (транзакции IEEE по обработке изображений), доступен здесь: https://ivulab.asu.edu/software.
проверьте алгоритмы CPBDM и JNBM. Если вы проверите код, его не очень сложно перенести, и, кстати, он основан на методе Марциалиано в качестве базовой функции.
источник
Я реализовал это, используя FFT в Matlab и проверить гистограмму FFT вычислить среднее значение и STD, но также можно сделать функцию подгонки
источник
Вот что я делаю в Opencv для определения качества фокусировки в регионе:
источник