Определение степени размытости изображения

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

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

Я использовал OpenCV и реализовал все шаги из этой статьи, но результат отличается от результата из этой статьи.

Может ли кто-нибудь дать мне совет по обнаружению «расширения размытия»?


person pars    schedule 18.10.2013    source источник


Ответы (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).
person ErmIg    schedule 18.10.2013
comment
Спасибо. Но что касается шага 6, вы имеете в виду, что если я хочу оценить значение размытия (так называемое расширение размытия), я могу выполнить шаги 2-4 в уменьшенном изображении, и результат 4 - это то, что я хочу? - person pars; 18.10.2013
comment
Что бы вы сделали для оценки уровня размытия/резкости на пиксель? - person Royi; 06.06.2014
comment
Это отличный подход, но будьте осторожны, потому что эта техника зависит от сцены! - person flaviussn; 19.08.2015
comment
@ Флейн, можешь объяснить, что значит «зависит от сцены»? - person Abc; 17.11.2017
comment
OP использует OpenCV, в котором есть функции для всех этих задач. Я не понимаю, почему вам нужно подключать свою собственную библиотеку в этом случае. Хотя бы упомяните, что написали библиотеку! - person Cris Luengo; 17.12.2018

Ответ 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()

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

person TheExorcist    schedule 17.12.2018

Здесь важно отметить, что изображение может иметь несколько размытых и резких областей. Например, если изображение содержит портретную фотографию, изображение на переднем плане будет четким, а фон размытым. В спортивной фотографии объект в фокусе резкий, а фон обычно размыт. Одним из способов обнаружения такого пространственно изменяющегося размытия на изображении является проведение анализа в частотной области в каждом месте изображения. Одной из статей, посвященных этой теме, является "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)
person Utkarsh Deshmukh    schedule 26.05.2021