1. 영상의 산술연산
덧셈연산
- 두 영상의 같은 위치에 존재하는 픽셀 값을 더하여 결과영상의 픽셀 값으로 설정
- 덧셈 결과가 255 보다 크면 픽셀값을 255로 설정(포화연산)
가중치 합
- 두 영상의 같은 위치에 존재하는 픽셀값에 대하여 가중치합을 계산하여 결과 영상의 픽셀값으로 설정
- 보통 a + b= 1 이 되도록 설정: 두 영상의 평균밝기 유지
평균 연산
- 가중치를 a = b = 0.5로 설정한 가중치 합.
뺄셈 연산
- 두 영상의 같은 위치에 존재하는 픽셀 값에 대하여 뺄셈 연산을 수행하여 결과 영상의 픽셀 값으로 설정
- 뺄셈 결과가 0보다 작으면 픽셀값을 0으로 설정(포화연산)
차이 연산
- 두 입력 연산에 대하여 뺄셈 연산을 수행한 후, 그 절댓값을 이용하여 결과 영상을 생성하는 연산
- 뺄셈 연산과 달리 입력연상 순서에 영향을 받지 않음.
행렬의 덧셈& 뺄셈
void add(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray(), int dtype = -1);
void subtract(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray(), int dtype = -1);
- src1: 첫번째 입력 행렬 또는 스칼라
- src2: 두번째 입력행렬 또는 스칼라
- dst: 출력행렬. dst의 깊이는 src1, src2의 깊이와 같거나 dtype 인자에 의해 결정됨.
- mask: 마스크 영상. mask행렬 원소 값이 0이 아닌 위치에서만 연산을 수행.
- dtype: 출력행렬의 깊이.
행렬의 가중치 연산
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1)
- src1: 첫번째 입력행렬
- alpha: src1의 가중치
- src2: 두번째 입력행렬
- beta: src2의 가중치
- gamma: 가중치 결과에 추가적으로 더할 값
- dst: 출력행렬. 입력행렬과 같은 크기, 같은 채널 수.
- dtype: 출력 행렬의 깊이.
void absdiff(InputArray src1, InputArray src2, OutputArray dst);
- src1: 첫번째 입력행렬 또는 스칼라
- src2: 두번째 입력행렬 또는 스칼라
- dst: 출력 행렬(차 영상). 입력행렬과 같은크기, 같은 채널 수.
2. 영상의 논리연산
행렬의 논리영상
void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
void bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray());
- src1: 첫번째 입력 행렬 또는 스칼라
- src2: 두번째 입력 행렬 또는 스칼라
- src: 입력 행렬 또는 스칼라
- dst: 출력행렬. 입력행렬과 같은 크기, 같은 채널 수
- mask: 마스크 행렬
실습 코드
int main()
{
VideoCapture cap("../data/base_camera_dark.avi");
Mat mask(480, 640, CV_8UC1, Scalar(0));
vector<Point> pts(4);
pts[0] = Point(240, 280);
pts[1] = Point(400, 280);
pts[2] = Point(620, 440);
pts[3] = Point(20, 440);
fillPoly(mask, pts, Scalar(255));
imshow("mask", mask);
Mat frame, gray, dst;
while (true) {
cap >> frame;
cvtColor(frame, gray, COLOR_BGR2GRAY);
bitwise_and(gray, mask, dst);
imshow("frame", frame);
imshow("dst", dst);
if (waitKey(20) == 27)
break;
}
}
결과 영상