Программно найти дрожащие ИЛИ вне фокуса Изображения

Большинство современных мобильных камер имеют семейство методов, называемых стабилизацией изображения, для уменьшения дрожания эффектов на фотографиях благодаря движению объектива камеры или связанного с ней оборудования. Но все же довольно много мобильных камер производят шаткие фотографии. Есть ли надежный алгоритм или метод, который может быть реализован на мобильных устройствах, особенно на Android, для определения того, является ли данное входное изображение неустойчивым или нет? Я не ожидаю, что алгоритм стабилизирует входное изображение, но алгоритм / метод должен надежно возвращать окончательное логическое значение, является ли изображение неустойчивым или нет. Он не обязательно должен быть Java, но также может быть C / C ++, чтобы его можно было создать через собственный набор и выставить API на верхний уровень. Следующая иллюстрация описывает ожидаемый результат. Кроме того, этот вопрос касается проблем с одним изображением, поэтому в этом случае не будут работать решения на основе нескольких фреймов. Речь идет о изображениях, а не о видео.

Введите описание изображения здесь

Solutions Collecting From Web of "Программно найти дрожащие ИЛИ вне фокуса Изображения"

Если бы из фокусных изображений не было видно, что a) края размыты, поэтому любой оператор на основе градиента будет иметь низкие значения по сравнению с яркостью изображения. B) края размыты, поэтому любой оператор на основе кривизны будет иметь низкие значения. C) для Shaky изображения, пиксели будут коррелировать с другими пикселями в направлении тряски (перевод или поворот)

Я взял вашу фотографию в gimp, применил Sobel для a) и Laplacian для b) (доступно в openCV), и получил изображения, которые намного темнее в вышеупомянутой части.

Полагаю, что калибровочные пороги для общих изображений будут довольно сложными.

Вы имеете дело с видеопотоком или одним изображением

В случае видеопотока : лучший способ – рассчитать разницу между двумя соседними кадрами. И отметьте каждый пиксель разницей. Когда количество таких пикселей низкое – вы находитесь в неустойчивом фрейме. Обратите внимание, что этот метод не проверяет, находится ли изображение в фокусе, но только для борьбы с размытым движением изображения. Ваша реализация должна включать следующее

  1. Для каждого кадра «i» – нормализовать изображение (работа с уровнем серого, когда работа с плавающими точками нормализует среднее значение до 0 и стандартное отклонение до 1)
  2. Сохраните предыдущий видеокадр.
  3. На каждом новом видеокадре вычислить разницу в пикселях между изображениями и подсчитать количество пикселей, для которых разница превышает некоторый порог. Если количество таких пикселей слишком велико (скажем,> 5% изображения), это означает, что движение между предыдущим кадром и текущим кадром велико, и вы ожидаете размытия движения. Когда человек крепко держит телефон, вы увидите резкое падение количества пикселей, которые изменились.
  4. Если ваши изображения представлены не в плавающей запятой, а в неподвижной точке (скажем 0,255), чем вы можете сопоставить гистограммы изображений перед вычитанием, чтобы уменьшить шум.
  5. Пока вы получаете изображения с движением, просто снимите эти кадры и покажите сообщение пользователю «крепко держите телефон». Как только вы получите хорошее стабилизированное изображение, обработайте его, но продолжайте запоминать предыдущий и делайте вычитание для каждого видео кадра.

Алгоритм выше должен быть достаточно сильным (я использовал его в одном из моих проектов, и он работал как магия).

В случае Single Image : Алгоритм выше не решает нефокусированные изображения и не имеет отношения к одному изображению.

  1. Чтобы решить фокус, я рекомендую вычислять края изображения и подсчитывать количество пикселей с сильными краями (выше порога). Когда вы получаете большое количество пикселей с ребрами (скажем,> 5% изображения), вы говорите, что изображение находится в фокусе. Этот алгоритм далек от совершенства и может совершать много ошибок, в зависимости от текстуры изображения. Я рекомендую использовать X, Y и диагональные края, но сгладить изображение до обнаружения края, чтобы уменьшить шум.
  2. Более сильный алгоритм будет брать все ребра (производные) и вычислять их гистограмму (сколько пикселей на изображении имеет эту специфическую интенсивность краев). Это делается путем первого вычисления изображения ребер и вычисления гистограммы краевого изображения. Теперь вы можете проанализировать форму гистограммы (распределение силы краев). Например, возьмите только верхние 5% пикселей с самыми сильными краями и вычислите дисперсию интенсивности их краев.
  3. Важный факт. В нефокусированных изображениях вы ожидаете, что большинство пикселей имеют очень низкий ответ на край, мало кто имеет средний ответ от края и почти нулевый с сильным ответвлением кромки. В изображениях с совершенным фокусом у вас все еще есть большинство пикселей с низким ответным фронтом, но соотношение между средним ответом и сильным откликом изменяется. Вы можете видеть это в форме гистограммы. Вот почему я рекомендую брать только несколько% пикселей с самым сильным ответным эффектом и работать только с ними. Остальные – всего лишь шум. Даже простой алгоритм определения соотношения между количеством пикселей с сильным ответом, деленным на количество пикселей со средними краями, будет довольно хорошим.

Фокусная проблема в видео :

  1. Если у вас есть видеопоток, то вы можете использовать описанные выше алгоритмы для обнаружения проблемных фокусов, но вместо использования постоянных порогов просто обновите их по мере запуска видео. В конечном счете они будут сходиться к лучшим значениям, чем предопределенные константы.

Последнее примечание: проблема обнаружения фокуса в одном изображении очень жесткая. Существует множество научных работ (с использованием импульсов преобразования Фурье и других «больших алгоритмических пушек»). Но проблема остается очень сложной, потому что, когда вы смотрите на размытое изображение, вы не можете знать, вызвала ли она камеру размытие с неправильным фокусом, или оригинальная реальность уже размыта (например, белые стены очень размыты, сделанные снимки В темноте, как правило, размыты даже при идеальном фокусе, картины поверхности воды, поверхность стола, как правило, размыты). Во всяком случае, существует несколько потоков в переполнении стека относительно фокуса на изображении. Как этот . Пожалуйста, прочитайте их.

Вы также можете вычислить преобразование Фурье изображения, а затем, если есть небольшое накопление в ячейках высоких частот, тогда изображение, вероятно, будет размытым. JTransform – это разумная библиотека, которая предоставляет FFT, если вы хотите путешествовать по этому маршруту.

Существует также довольно обширная запись в блоге о различных методах, которые можно использовать

Существует еще один вопрос переполнения стека, задающий этот вопрос, но с OpenCV , OpenCV также имеет привязки Java и может использоваться в проектах Android, поэтому этот ответ также может быть полезен.