Кажется, ваш код повторяет работу, описанную в статье.
К сожалению, совсем не так просто определить, размыто изображение или нет. Это можно использовать для сравнения нескольких изображений одной и той же сцены , чтобы увидеть, какое из них более резкое или более размытое. Если освещение изменится или содержимое сцены изменится, сравнение будет невозможно.
Я не знаю ни одного надежного метода, позволяющего отличить guish от неправильного сфокусировать изображение, если нет сфокусированного изображения для сравнения. Все эти методы потерпят неудачу, сообщая вам, что идеально сфокусированное изображение белой стены не в фокусе.
Лучшее, что можно сделать, это сравнить мощность (квадрат величины частотных составляющих) при более высокие частоты по сравнению с более низкими частотами (например, с использованием полосовых фильтров). Это скажет вам, есть ли на изображении какие-либо острые края или нет. Конечно, он скажет вам, что изображение не в фокусе, если сцена содержит только плавные переходы и нет резких краев.
У этого другого Q&A есть еще несколько идей.
Nit pick:
img_4 = np.fft.ifftshift(img_3)
отменяет действия img_3 = np.fft.fftshift(img_2)
, так что img_4 == img_2
. Тем не менее, смещение начала координат в области Фурье не влияет на какую-либо последующую обработку, поэтому не имеет значения, используется ли в вычислениях img_2
, img_3
или img_4
.