이번 포스팅은 객체 추적 중 하나의 방법인 배경 제거(Background Subtraction)에 대해 알아보겠습니다.
포스팅 관련 내용은 아래에서 출처를 얻어 사용하였습니다.
https://docs.opencv.org/3.4/d1/dc5/tutorial_background_subtraction.html
Background Subtraction (배경 제거)
배경 제거는 영상에서 객체가 있는 배경에서 객체가 없는 배경을 빼서 출력해주는 것을 말합니다.
이는 객체를 추적할 때 객체가 무엇인지 어디에 있는지 파악하게 해주는 방법입니다.
아래의 그림을 보면 이해가 쉬울 거예요!
위 그림을 보시면 객체(배)가 있는 사진에서 객체(배)가 없는 사진을 빼서 결국 객체만 얻는 것을 볼 수 있습니다.
Background Subtraction Algorithm(배경 제거 알고리즘)
- 배경을 제거하는 여러 가지 방법이 있지만,
이번 포스팅은 OpenCV에서 제공하는 2가지 알고리즘에 대해 설명하고자 합니다.
1. BackgroundSubtractorMOG
- 기본 형태 : cv2.bgsegm.createBackgroundSubtractorMOG(history, nmixtures, backgroundRatio, noiseSigma)
history = 200(Default) : 히스토리 길이
nmixtures = 5(Default) : 가우시안 혼합의 개수
backgroundRatio = 0.7(Default) : 배경 비율
noiseSigma = 0(Default) : 노이즈 강도 (0=자동)
- 가우시안 혼합(Gaussian Mixture)으로 실행되는 배경 분할 알고리즘입니다. 이것은 k의 값이 5(Default)인 가우시안 분포의 혼합(mixture)을 배경에 적용함으로써 배경 제거를 하는 방법입니다. mixture에 대한 가중치는 색상이 머무는 시간 비율을 나타내는 것이며, 이는 배경으로 생각되는 색이 더 오래 머무른다는 것입니다.
- cv2.createBackgroundSubtractorMOG() 함수를 사용하기 위해 전경 마스크를 얻어야 하는데 그것은
backgroundsubtractor.apply(img, foregroundmask, learningRate)를 사용하여 얻습니다!
img : 입력 영상
foregroundmask(Default) : 전경 마스크
learningRate = -1(Default) : 배경 훈련 속도(0 ~ 1)
- 아래 코드를 보며 예시를 확인해봅시다.
import cv2
import numpy as np
cap = cv2.VideoCapture('./images/walking.avi')
fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()
while (1):
ret, frame = cap.read()
frame = cv2.resize(frame,(400,400))
fgmask = fgbg.apply(frame)
cv2.imshow('original',frame)
cv2.imshow('MOG',fgmask)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
- 결과
2. BackgroundSubtractorMOG2
- 기본 형태 : cv2.createBackgroundSubtractorMOG2(history, varThreshold, detectShadows)
history = 500(Default) : 히스토리 개수
varThreshold = 16(Default) : 분산 임계 값
detectShadows = True(Default) : 그림자 표시
- BackgroundSubtractorMOG2 또한 가우시안 믹스쳐를 이용한 배경 분할 알고리즘입니다.
이 알고리즘의 중요한 특징은 각 픽셀에 적절한 가우시안 분포 값을 선택한다는 것입니다. 따라서 이것은 조명 변화가 심한 영상에 더 좋은 결과를 보여줍니다.
- 이전 경우처럼 배경 객체를 apply()로 선택할 수 있으며 또한 그림자를 탐지할지 안 할지 결정할 수 있습니다.
detectShadows = True (Default) 라면 그림자를 탐지하고 나타내지만 속도가 줄어듭니다.
그림자는 회색으로 표시됩니다.
- 코드
# 배경제거
import cv2
import numpy as np
cap = cv2.VideoCapture('./images/walking.avi')
fgbg = cv2.createBackgroundSubtractorMOG2()
while (1):
ret, frame = cap.read()
frame = cv2.resize(frame,(400,400))
fgmask = fgbg.apply(frame)
cv2.imshow('original',frame)
cv2.imshow('MOG2',fgmask)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
앞서 실행했던 코드와 다른 것은 다 똑같고 fgbg만 cv2.createBackgroundSubtractorMOG2()로 바꿨습니다.
- 결과
- 차이점
MOG2는 앞의 결과와 다르게 그림자가 회색으로 표현되는 것을 볼 수 있고 노이즈가 조금 더 많은 것을 볼 수 있습니다.
BackgroundSubtractorMOG2의 결과의 노이즈를 제거하기 위해서 앞서 포스팅했던 모폴로지를 이용하면 어떨까 해서 해보려고 합니다.
이렇게 객체 추적의 방법 중 배경 제거에 대해 알아보았고 질문이나 틀린 점이 있으면 댓글로 남겨주세요!
다음 포스팅으로 찾아오겠습니다
감사합니다 :)
'영상처리' 카테고리의 다른 글
Python - OpenCV (9) : Image Thresholding (0) | 2021.07.14 |
---|---|
Python - OpenCV (8) : k-means Clustering (0) | 2021.07.13 |
Python - OpenCV (6) : Image Inpainting (0) | 2021.07.09 |
Python - OpenCV (5) : 허프 변환 (Hough Transformation) (0) | 2021.05.25 |
Python - OpenCV (4) : 컨투어(contour) 1 (0) | 2020.12.06 |