Сравнение размытости двух похожих изображений

Я работаю над прототипом приложения для создания карты (изображения) ткани, отсканированной с помощью микроскопа. Для этого я:

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

Код для извлечения кадров из видео прост и понятен сам по себе:

import cv2
vidcap = cv2.VideoCapture('.\images\microscope2.avi')
success,image = vidcap.read()
count = 0
success = True
while success:
  success,image = vidcap.read()
  if (count / 20) * 20 == count:
      cv2.imwrite("./images/microscope/frame%d.jpg" % (count/20), image)
  if cv2.waitKey(10) == 27:
      break
  count += 1

Как вы можете заметить, я просто извлекаю один кадр каждые 20. Моя текущая проблема заключается в том, что некоторые кадры размыты, поэтому алгоритм сшивания не может обнаружить особенности, чтобы выровнять и перекрыть изображения.

Одно из решений может состоять в том, чтобы взять несколько — скажем, 3 — последовательных кадра каждые 20, найти тот, который менее размыт, и отбросить остальные.

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

Вопрос:

Есть ли умный/простой способ сравнить очень похожие изображения, чтобы определить, какое из них менее (или более) размыто?


person L.C.    schedule 07.03.2019    source источник
comment
Относительно вашего исследования тканей: вы останавливаетесь в каком-то положении, скажем, не менее чем на 3 кадра, затем перемещаете слайд (это ваши размытые изображения? 3 кадра? Если это верно (более или менее), просто рассчитайте кадровые различия. Должны быть соседние кадры с минимальными различиями, когда вы останавливаетесь в фиксированном положении (если частота кадров подходит высокая). Это ваши желаемые кадры, поэтому вам не нужен фиксированный размер шага при извлечении.   -  person HansHirse    schedule 07.03.2019
comment
@HansHirse да, во-первых, размытие в движении, но также (по какой-то причине я не понимаю), когда я останавливаюсь в позиции, как вы описали, изображение остается размытым в течение секунды, прежде чем оно получит хороший фокус ... но микроскоп, который я использую не имеет автофокуса. В любом случае, хорошая идея, я попробую и посмотрю, как пойдет.   -  person L.C.    schedule 07.03.2019
comment
Когда вам также приходится иметь дело с размытием автофокуса, оставаясь в фиксированном положении, моя идея может нуждаться в некотором расширении: вы получите похожие соседние кадры дважды за короткое время (сначала одинаковые размытые кадры, затем одинаковые сфокусированные кадры). Может быть, можно использовать эту информацию и пренебречь первым попаданием. Кроме того, вам нужно мгновенное решение для данного изображения (например, обработка в реальном времени) — или вы можете извлечь индексы кадров, а затем извлечь сами кадры из видео? Это было бы требованием для моей идеи.   -  person HansHirse    schedule 07.03.2019
comment
Нет необходимости в реальном времени (я добавляю информацию к вопросу)   -  person L.C.    schedule 07.03.2019


Ответы (1)


Размытость изображения можно оценить с помощью

cv2.Laplacian(image, cv2.CV_64F).var()

См. также этот отличный пост https://www.pyimagesearch.com/2015/09/07/blur-detection-with-opencv/, откуда было взято это предложение.

person stein    schedule 07.03.2019
comment
Я часто такое вижу, возможно, из-за популярности Адриана. Работает ли лапласовский подход также/действительно для размытия, связанного с автофокусом, в микроскопии? Большинство примеров, которые я вижу, связаны с размытием движения или размытием автофокуса естественных сцен. Были бы интересны источники по этой теме. - person HansHirse; 07.03.2019
comment
Насколько я проверял, это работает не так хорошо, как для естественных сцен. Дело в том, что в моем случае я смотрю на разреженные ячейки, поэтому часть изображения выглядит размытой, даже если ячейки находятся в фокусе. Я все еще пытаюсь понять, смогу ли я настроить это для работы, например, вычитая средний лапласиан для каждого лапласиана изображения (действительно размытые изображения должны по-прежнему давать более низкие значения, поэтому я ожидаю получить отрицательные значения). УФ: ответ актуален, @stan заслуживает права добавлять комментарии. - person L.C.; 07.03.2019
comment
@HansHirse Эта статья optica.csic.es/papers/icpr2k.pdf может быть интерес. Насколько я могу судить, описанный выше метод изначально был предложен именно там. - person stein; 07.03.2019
comment
Это работает: разница в измерении меньше, чем в естественных сценах, но я сравнивал худшие и лучшие кадры каждые 30 кадров в своем видео. На худших кадрах почти всегда видно размытие в движении, на лучших — никогда. - person L.C.; 19.03.2019