scikit-image threshold_multiotsu вывод черных кадров из видео - PullRequest
0 голосов
/ 30 января 2020

В настоящее время я работаю над проектом, который принимает видеофайл, читает отдельные кадры в градациях серого, нормализует их, пороговые значения, а затем выводит их в виде отдельных файлов .jpg. Ниже у меня есть две функции, frameCapture() и frameCaptureMulti(). Первый использует cv2.threshold и cv2.THRESH_OTSU и работает как задумано. Последний использует threshold_multiotsu() из skimage.filters и выводит полностью черные кадры.

import cv2
import numpy as np
from skimage.filters import threshold_multiotsu
def frameCapture(fc_path):
    fc_vidObj = cv2.VideoCapture(fc_path) # Path to video file
    fc_count = 0                          # Used as counter variable
    fc_success = 1                        # Checks if the frames were extracted

    while fc_success:
        # vidObj object calls read
        fc_success, fc_image = fc_vidObj.read()
        fc_image = cv2.cvtColor(fc_image, cv2.COLOR_BGR2GRAY) # Convert the image to grayscale
        fc_image = cv2.GaussianBlur(fc_image,(5,5),0) # Gaussian noise filtering
        (threshold, fc_image) = cv2.threshold(fc_image, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # Normalize & Segment
        cv2.imwrite("frame%d.jpg" % fc_count, fc_image) # Saves the frames
        fc_count += 1
def frameCaptureMulti(fc_path):
    fc_vidObj = cv2.VideoCapture(fc_path) # Path to video file
    fc_count = 0                          # Used as counter variable
    fc_success = 1                        # Checks if the frames were extracted

    while fc_success:
        # vidObj object calls read
        fc_success, fc_image = fc_vidObj.read()
        fc_image = cv2.cvtColor(fc_image, cv2.COLOR_BGR2GRAY) # Convert the image to grayscale
        fc_image = cv2.GaussianBlur(fc_image,(5,5),0) # Gaussian noise filtering
        fc_thresholds = threshold_multiotsu(fc_image)
        fc_regions = np.digitize(fc_image, bins=fc_thresholds)
        cv2.imwrite("frame%d.jpg" % fc_count, fc_regions) # Saves the frames
        fc_count += 1

Код драйвера просто запускает frameCaptureMulti () для файла .mp4 на моем компьютере.

Вот как выглядят кадры: frameCapture() вывод frameCapture() output

frameCaptureMulti() вывод: frameCaptureMulti() output

Я не уверен, почему frameCaptureMulti() производит чистый черный цвет кадры. У меня есть только несколько недель опыта работы с Python (за исключением обучения около десяти лет go) и даже меньше с этими конкретными библиотеками, поэтому любая помощь в том, почему мой код не выдает ожидаемый результат, приветствуется.

Страницы, на которые ссылаются части кода в frameCapture и frameCaptureMulti: https://scikit-image.org/docs/dev/auto_examples/segmentation/plot_multiotsu.html https://www.geeksforgeeks.org/python-program-extract-frames-using-opencv/

1 Ответ

1 голос
/ 02 февраля 2020

Я думаю, что происходит то, что CV2 дает вам двоичное изображение, которое правильно сохраняется как кадр с 0 под порогом и 255 (белый) над ним. Между тем, threshold_multiotsu и np.digitize возвращают изображение со значениями 0, 1, 2, все из которых выглядят черными в диапазоне 0-255, поддерживаемом jpeg. Вы можете использовать skimage.exposure.rescale_intensity для отображения этих значений, например, 0, 127, 255.

...