0
respostas

Ruído na imagem

O filtro não funcionou muito bem, com muito ruído, em algumas horas chegando a aparecer quase toda a ponte. O meu código é o seguinte:

import cv2
import sys
import numpy as np

VIDEO = r'data/Ponte.mp4'

algorithym_types = ('KNN', 'GMG', 'CNT', 'MOG', 'MOG2')
algorithym_type = algorithym_types[3]

def Kernel(KERNEL_TYPE, x=3, y=3):
    if KERNEL_TYPE == 'dilation':
        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (x, y))
    elif KERNEL_TYPE == 'opening':
        kernel = np.ones((x, y), np.uint8)
    elif KERNEL_TYPE == 'closing':
        kernel = np.ones((x, y), np.uint8)
    return kernel


def Filter(img, filter):
    if filter == 'closing':
        return cv2.morphologyEx(img, cv2.MORPH_CLOSE, Kernel('closing'), iterations=2)
    elif filter == 'opening':
        return cv2.morphologyEx(img, cv2.MORPH_OPEN, Kernel('opening'), iterations=2)
    elif filter == 'dilation':
        return cv2.dilate(img, Kernel('dilation'), iterations=2)
    if filter == 'combine':
        closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, Kernel('closing'), iterations=2)
        opening =  cv2.morphologyEx(closing, cv2.MORPH_OPEN, Kernel('opening'), iterations=2)
        dilation = cv2.dilate(opening, Kernel('dilation'), iterations=2)
        return dilation


def subtractor(algorithym_type : str):
    match algorithym_type:
        case 'KNN':
            return cv2.createBackgroundSubtractorKNN()
        case 'GMG':
            return cv2.bgsegm.createBackgroundSubtractorGMG()
        case 'CNT':
            return cv2.bgsegm.createBackgroundSubtractorCNT()
        case 'MOG':
            return cv2.bgsegm.createBackgroundSubtractorMOG()
        case 'MOG2':
            return cv2.createBackgroundSubtractorMOG2()
        case _:
            print('algoritmo não encontrado.')
            sys.exit(1)

cap = cv2.VideoCapture(VIDEO)
background_subtractor = subtractor(algorithym_type)

def main():
    while(cap.isOpened):
        ok, frame = cap.read()

        if not(ok):
            print('Frames acabaram')
            break

        mask = background_subtractor.apply(frame)
        mask_filter =Filter(mask, 'combine')
        cars_after_mask = cv2.bitwise_and(frame, frame, mask=mask_filter)

        cv2.imshow('Frame', frame)
        cv2.imshow('MaskFilter', cars_after_mask)

        if cv2.waitKey(1) & 0xFF == ord('c'):
            break
main()