Работа с OpenCV Python, Microscopi c Видео - PullRequest
1 голос
/ 24 марта 2020

У меня медленно работает Imshow, когда я использовал фреймворк Scikit, это из-за следующего кода?

while True:
    ret, frame = offlinevid.read()
    frame = cv2.resize(frame, size, interpolation = cv2.INTER_AREA)
    # Test Processing
    imgforprocessing = img_as_float(frame)
    sigma_est = np.mean(estimate_sigma(imgforprocessing, multichannel = True))
    nlm = denoise_nl_means(imgforprocessing, h = 1.5*sigma_est, fast_mode=True, patch_size = 5, patch_distance= 3, multichannel = True)
    #cv2.imshow("Test", nlm) 
    cv2.imshow("Test", frame)

Я хочу воспроизводить как обычное видео со скоростью 30 кадров в секунду, но когда я добавляю denoise_nl_means, оно просто падает до 5 кадров в секунду. Как я могу улучшить это?

Редактировать: я должен предоставить больше информации. Когда я удалил denoise_nl_means, частота кадров воспроизведения видео стала нормальной. Я хочу использовать шум, потому что я работаю с микроскопическими c изображениями, которые имеют много шума. Есть ли функция OpenCV для меня, чтобы сделать то же самое, что denoise_nl_means?

Я пробовал Обнаружение гребня с морфингом

ridge_filter = cv2.ximgproc.RidgeDetectionFilter_create(cv2.CV_32FC1, 1, 1 , 3, cv2.CV_8UC1, 1, 0 , cv2.BORDER_DEFAULT)
    ridges = ridge_filter.getRidgeFilteredImage(frame)

    blank_mask = np.zeros(frame.shape, dtype=np.uint8)
    thresh = cv2.threshold(ridges, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
    opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)  

    inverse = 255 - opening
    inverse = cv2.merge([inverse,inverse,inverse])
    removed_artifacts = cv2.bitwise_and(frame,frame,mask=opening)

В удаленных артефактах все еще присутствует шум от микроскопических изображений c. Это просто пример Изображение , и результаты очень шумные. Любое предложение о том, как их удалить?

1 Ответ

1 голос
/ 24 марта 2020

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

Если ваш код работает на скорости 30 кадров в секунду без обработки, мы можем сделать вывод, что получение, вероятно, займет 33 мс - хотя вы должны измерить его.

Если код выполняется с частотой 5 кадров в секунду при обработке, это означает, что 200 мс на кадр, поэтому мы можем сделать вывод, что для обработки требуется 167 мс, то есть 200 мс - 33 мс.

Итак, Ваша лучшая ставка: либо

  • найти эквивалентный алгоритм, который является настолько же эффективным и быстрым, либо
  • попытаться использовать многопроцессорную обработку для отправки циклического перебора кадров каждому, скажем , 4 ядра процессора, так что мы надеемся, что вы получите обратно зашумленный кадр каждые 42 мс (167/4), это означает, что вы можете надеяться приблизиться к 20-25 кадрам в секунду.

Далее, вы должны рассмотреть предоставление фактического изображения вместо скриншота ваших объединенных результатов, чтобы люди могли запускать тесты на репрезентативных данных и даже просто знать размер ваше изображение. Фактические изображения ваших обработанных данных также будут полезны для оценки эффективности шумоподавления. Также лучше, если вы включите операторы import, чтобы люди знали, какие модули вы используете.

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