Обнаружение размытия изображения

Я хочу определить, насколько размыто изображение, может быть, это можно назвать "размытием". Я нашел полезную статью для этого:

http://www.cs.cmu.edu/~htong/pdf/ICME04_tong.pdf

Я использую OpenCV и делаю все шаги из этой статьи, но результат не совпадает с результатом из этой статьи?

Может быть, моя программа не работает хорошо? Или кто-то может дать мне какой-либо совет для обнаружения "размытия".

Спасибо.

3 ответа

Решение

Вы можете обнаружить размытое изображение, используя следующий алгоритм:

  1. Преобразуйте изображение в серый формат.
  2. Рассчитаем максимальную абсолютную вторую производную по серому изображению (для каждой точки):

    d [x, y] = max (abs (2 * d [x, y] - d [x, y + 1] -d [x, y-1]), abs (2 * d [x, y] - d [x + 1, y] -d [x-1, y]));

  3. Рассчитайте гистограмму этого оценочного изображения (максимальная абсолютная вторая производная).

  4. Найдите верхний квантиль (0,999) этой гистограммы.

  5. Если это значение меньше порогового значения (около 25% от динамического диапазона изображения), тогда изображение размыто.

  6. Если вы хотите оценить значение размытия, выполните шаги 2-5 для уменьшенного изображения.

Вы можете написать эти алгоритмы самостоятельно или использовать один из реализации библиотеки Simd.

  • Simd:: BgrToGray или Simd::BgraToGray (для шага 1).
  • Simd:: AbsSecondDerivativeHistogram (для шагов 2-5).
  • Simd:: ReduceGray2x2 (для шага 6).

Ответ Ermlg выглядит близко к лучшему, но в коде таким образом я достиг этого.

Счет ниже 100 дал мне несколько нечетких изображений.

# applying fast fourier transform to fin d the blur images , taken threshold to be 100 but it can vary

import cv2

def variance_of_laplacian(frame_path):
    # compute the Laplacian of the image and then return the focus
    # measure, which is simply the variance of the Laplacian
    image = cv2.imread(frame_path)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    return cv2.Laplacian(gray, cv2.CV_64F).var()

Источник метода был от Адриана Роузброка

Здесь следует отметить один важный момент: изображение может иметь несколько размытых и резких участков. Например, если изображение содержит портретную фотографию, изображение на переднем плане будет резким, а фон - размытым. В спортивной фотографии объект в фокусе резкий, а фон обычно имеет размытость. Один из способов обнаружить такое пространственно изменяющееся размытие в изображении - запустить анализ частотной области в каждом месте изображения. Одна из статей, посвященных этой теме: "Spatially-Varying Blur Detection Based on Multiscale Fused and Sorted Transform Coefficients of Gradient Magnitudes" (cvpr2017).

  • авторы рассматривают коэффициенты DCT с различным разрешением для каждого пикселя. Эти DCT-коэффициенты делятся на полосы низких , средних и высоких частот, из которых выбираются только высокочастотные коэффициенты.
  • Затем коэффициенты DCT объединяются и сортируются, чтобы сформировать multiscale-fused and sorted high-frequency transform coefficients
  • Выбирается подмножество этих коэффициентов. количество выбранных коэффициентов - это настраиваемый параметр, зависящий от приложения.
  • Выбранное подмножество коэффициентов затем отправляется через блок максимального объединения, чтобы сохранить максимальную активацию во всех шкалах. Это дает карту размытия в качестве выходных данных, которые затем отправляются на этап постобработки для уточнения карты.

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

Вот несколько примеров результатов работы алгоритма:

Резкие области изображения имеют высокую интенсивность в blur_map, тогда как размытые области имеют низкую интенсивность.

Ссылка на проект на github: https://github.com/Utkarsh-Deshmukh/Spatially-Varying-Blur-Detection-python.

Реализацию этого алгоритма на python можно найти на pypi, который можно легко установить, как показано ниже:

      pip install blur_detector

Пример фрагмента кода для создания карты размытия выглядит следующим образом:

      import blur_detector
import cv2
if __name__ == '__main__':
    img = cv2.imread('image_name', 0)
    blur_map = blur_detector.detectBlur(img, downsampling_factor=4, num_scales=4, scale_start=2, num_iterations_RF_filter=3)

    cv2.imshow('ori_img', img)
    cv2.imshow('blur_map', blur_map)
    cv2.waitKey(0)
Другие вопросы по тегам