영상의 산술 및 논리연산

전종원·2022년 10월 19일
0

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;
	}

}

결과 영상

0개의 댓글