본문 바로가기
Computer Vision

영상의 산술 및 논리 연산 - 1. 영상의 산술 연산

by ksb0511 2020. 2. 26.
  • 영상은 2차원 행렬이므로 산술 연산 적용 가능.
  • 두 개의 영상 더하기

  • src1, src2는 입력 영상, dst는 덧셈 연산의 결과 영상
  • 이 때 포화연산도 당연히 함께 수행하여야 함.(255가 최댓값)


// add() 함수
void add(InputArray src1, InputArray src2, OutputArray dst,
	InputArray mask = noArray(), int dtype = -1);

 

  • src1과 src2 행렬 깊이가 다르다면 dtype 인자를 지정해야 함. 같다면 기본값이 있으니 변경할 필요 x -> 두 영상의 타입이 서로 같을 경우 지정하지 않아도 된다는 뜻.
  • 두 입력 영상 타입이 같을 경우 add() 함수를 대신하여 +연산자 재정의 사용 가능.

  • 영상을 더할 때 가중치를 부여하여 덧셈 가능. 두 개의 행렬에 가중치를 부여하여 수식 표현할 경우의 연산

  • 알파와 베타는 각 영상의 가중치를 의미하는 실수로 두 가중치의 합이 1이 되도록 설정해야 포화되는 픽셀이 발생하지 않음.
  • 가중치가 높은 쪽의 영상 윤곽이 더 많이 나타남.
  • 만약 두 가중치의 합이 1보다 클 경우 결과 영상이 두 입력 영상보다 밝아지고, 포화 현상이 발생할 수 있음. 반대의 경우 어두워짐.

// 두 영상의 가중치 합을 구하는 함수
void addWeighted(InputArray src1, double alpha, InputArray src2,
	double beta, double gamma, OutputArray dst, int dtype = -1);

 

  • gamma 인자를 통해 가중치의 합에 추가적인 덧셈을 한 번에 수행할 수 있음.


// subtract() 함수
void subtract(InputArray src1, InputArray src2, OutputArray dst,
	InputArray mask=noArray(), int dtype=-1);

 

  • 덧셈과 같은 원리로 - 연산자 재정의 사용 가능.
  • 덧셈 연산과 다른 부분은 뺄셈의 대상이 되는 영상 순서에 따라 결과의 차이가 나타남.

// 차이 연산 함수
void absdiff(InputArray src1, InputArray src2, OutputArray dst);

 

  • 뺄셈 연산의 경우 순서에 따라 결과의 차이가 발생하지만 absdiff() 함수를 이용한 차이 연산을 할 경우 순서에 상관없이 결과가 나타남.
  • 픽셀 값 차이가 큰 영역을 위주로 나타내는 연산
  • 뺄셈 연산 결과에 절댓값을 취하는 연산
  • 차이 연산으로 나온 결과 영상은 차영상이라고 함.

// multiply() 함수
void multiply(InputArray src1, InputArray src2,
	OutputArray dst, double scale = 1, int dtype = -1, int dtype = -1);
    
// divide() 함수
void divide(InputArray src1, InputArray src2, OutputArray dst,
	double scale = 1, int dtype = -1);

 

  • 영상의 같은 위치에 있는 픽셀 값끼리 서로 곱하거나 나누는 연산을 수행하는 함수

댓글