이미지 연산
차연산
차연산: 같은 장소를 촬영한 2장 이상의 이미지를 사용하여 새로 추가된 객체를 검출하는 방법.
(배경이미지)
(객체가 추가된 이미지)
(객체가 있는 이미지)- (배경만 찍은 이미지) = 차영상
코드
subtract(img_object, img_background, img_sub);
- img_object: 추가된 그림
- img_background: 원래그림
- img_sub: 추출한 그림
[주의]
차영상을 구하면 2장의 이미지가 겹치는 부분이 보일 수도 있음
그러므로 정확한 객체추출을 위해 이진화 필요
- 더 좋은 결과를 위해 색을 반전해줘도 좋겠죠?
C++
# include < opencv2/opencv.hpp>
using namespace cv;
int main()
{ // 노트가 없을 때 이미지 background.png와 // 노트가 있을 때 이미지 object.png를 그레이 스케일로 불러옵니다.
Mat img_background, img_object;
img_background = imread("background.png", IMREAD_GRAYSCALE);
img_object = imread("object.png", IMREAD_GRAYSCALE);
// 노트가 있는 이미지 img_object에서 // 노트가 없는 이미지 img_background를 빼서 차영상을 얻습니다.
// 빼는 순서를 바꾸면 안됩니다.
Mat img_sub;
subtract(img_object, img_background, img_sub);
// 차영상을 이진화합니다.
Mat img_binary;
threshold(img_sub, img_binary, 5, 255, THRESH_BINARY);
imshow("background", img_background);
imshow("object", img_object);
imshow("sub", img_sub);
imshow("binary", img_binary);
waitKey(0);
return 0;
}
PYTHON
import cv2 as cv
# 사람이 없을 때 이미지 background.png와 # 사람이 있을 때 이미지 object.png를 불러옵니다.
img_background = cv.imread('background.png', cv.IMREAD_GRAYSCALE)
img_object = cv.imread('object.png', cv.IMREAD_GRAYSCALE)
# 사람이 있는 이미지 img_object에서 # 사람이 없는 이미지 img_background를 빼서 차영상을 얻습니다.
# 빼는 순서를 바꾸면 안됩니다.
img_sub = cv.subtract(img_object, img_background)
# 차영상을 이진화합니다.
retval,img_binary = cv.threshold(img_sub, 50, 255, cv.THRESH_BINARY)
cv.imshow('background', img_background)
cv.imshow('object', img_object)
cv.imshow('sub', img_sub)
cv.imshow('binary', img_binary)
cv.waitKey(0)