Python

Обнаружение размытия с помощью OpenCV

Время прочтения: 4 мин.

Дисперсия Лапласа

Прежде чем, получить дисперсию Лапласа по своему изображению, необходимо установить библиотеку OpenCV через стандартный pip в cmd:

pip install opencv-python
cv2.Laplacian(image, cv2.CV_64F).var()

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

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

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

Оператор Лапласа выделяет области изображения, содержащие быстрые изменения интенсивности, во многом подобно операторам Собеля и Шарра. И, как и эти операторы, Лаплас часто используется для обнаружения границ.

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

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

Работа скрипта на примере фото (определение BlurryandNotBlurry)

Для того, чтобы начать писать скрипт, установите новый пакет Python через pip:

pip install imutils

Пусть название нового скрипта будет blur.py

Функция variance_of_laplacian принимает только один аргумент, предполагается, что это один канал, например, изображение в оттенках серого, для которого мы хотим вычислить меру фокуса и свернуть изображение через оператор Лапласа 3 на 3, который вернет нам значение дисперсии.

from imutils import paths
import argparse
import cv2

def variance_of_laplacian(image):
return cv2.Laplacian(image, cv2.CV_64F).var()
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--images", required=True,
help="path to input directory of images")
ap.add_argument("-t", "--threshold", type=float, default=100.0,
help="focus measures that fall below this value will be considered 'blurry'")
args = vars(ap.parse_args())

Эта часть скрипта позволяет обрабатывать синтаксический анализ наших аргументов командной строки. Первый переключатель, который нам понадобится – это –images, и путь к каталогу, в котором хранятся наши фотографии, которые мы хотим проверить на размытие.

for imagePath in paths.list_images(args["images"]):
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
fm = variance_of_laplacian(gray)
text = "Not Blurry"
if fm < args["threshold"]:
text = "Blurry"
cv2.putText(image, "{}: {:.2f}".format(text, fm), (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 3)
cv2.imshow("Image", image)
key = cv2.waitKey(0)

Мы начинаем перебирать наш каталог изображений imagePath. Каждое изображение преобразуется в оттенки серого, а затем применяется обнаружение размытия. Если мера фокуса превышает порог, представленный аргументом командной строки, то данное изображение помечается как «Blurry», в обратном случае «Not Blurry».

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

python blur.py --images images

Данный инструмент            можно использовать для оценки качества фотографий, в частности, для проверки качества объявлений, реализуемых на web-ресурсах по критерию размытости изображений.

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

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

final = cv2.medianBlur(source, 3)

которая может уменьшить шум и блюр, сохраняя при этом более острые края.

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

Советуем почитать