본문 바로가기
컴퓨터 비전

영상의 산술 및 논리 연산

by 태풍사랑 2020. 2. 25.

1. 영상의 산술 연산

  • 영상은 2차원 행렬이기 때문에 산술 연산을 그대로 적용 가능 -> 두개의 연산을 더하거나 빼는 연산을 통해 새로운 결과 영상 생성 가능! (But, 곱하거나 나누는 연산은 거의 사용 x)

① 덧셈 연산

dst(x,y) = src1(x,y) + src2(x,y) //덧셈 연산(두개의 입력 영상에서 같은 위치 픽셀 값을 서로 더하여 결과 영상 픽셀값으로 설정)
dst(x,y) = saturate(src1(x,y) + src2(x,y)) //그레이스케일 최댓값(255)로 설정하는 포화연산 수행
void add(InputArray src1, InputArray src2, OutputArray dst, 
		 InputArray mask = noArray(), int dtype = -1);
         //dtype = 출력 행렬의 깊이
         //입력 = 두 개의 행렬 또는 영상
         //출력 = 하나의 행렬 또는 영상
dst(x,y) = saturate(α*src1(x,y) + β*src2(x,y)) //가중치를 부여하여 덧셈 연산

 

  • 덧셈 연산 결과 영상 두 입력 영상의 윤곽을 조금씩 포함, 전반적으로 밝게 포화되는 부분↑ => 가중치 부여 덧셈 연산사용!
dst(x,y) = saturate(α*src1(x,y) + β*src2(x,y)) //가중치를 부여하여 덧셈 연산

 

  • addWeighted() = 두 영상의 가중치 합을 구하는 함수
void addWeighted(InputArray src1, double alpha, InputArray src2, 
				double beta, double gamma, OutputArray dst, int dtype = -1);
                //gamma = 가중합 결과에 추가적으로 더할 값

 

② 뺄셈 연산

dst(x,y) = saturate(src1(x,y) - src2(x,y))
void subtract(InputArray src1, InputArray src2, OutputArray dst, 
		      InputArray mask = noArray(), int dtype = -1);
              //서로 타입이 다른 두 영상기리 뺄셈 연산을 수행하려면 반드시 subtract() 함수 사용, dtype 인자 명시

 

  • 뺄셈 연산의 경우 연산 순서에 따라 결과가 다름 -> 순서 상관없이 픽셀 값 차이가 큰 영역을 두드러지게 나태내고 싶다면 => 차이 연산 수행!
  • 차이 연산 = 뺄셈 연산 결과에 절댓값을 취하는 연산
  • 차영상(difference imgae) = 차이 연산으로 구한 결과 영상
dst(x,y) = |src1(x,y) - src2(x,y)|
void absdiff(InputArray src1, InputArray src2, OutputArray dst);

 

③ 곱셈 & 나눗셈 연산

  • 영상을 이용하여 행렬의 곱셈을 수행하는 경우는 거의 없음
  • But, 두 영상에서 같은 위치에 있는 픽셀 값끼리 서로 곱하거나 나누는 연산 수행 가능
void multiply(InputArray src1, InputArray src2, 
			  OutputArray dst, double scale = 1, int dtype = -1); //곱셈 연산
              
void divide(InputArray src1, InputArray src2, 
			OutputArray dst, double scale = 1, int dtype = -1); //나눗셈 연산              

 

2. 영상의 논리 연산

  • 영상의 논리 연산 = 픽셀 값을 이진수로 표현하여 각 비트 단위 논리 연산을 수행하는 것
  • 논리곱(AND), 논리합(OR), 배타적 논리합(XOR), 부정(NOT) 연산 지원
입력 비트 논리 연산 결과
a b a AND b a OR b a XOR b NOT a
0 0 0 0 0 1
0 1 0 1 1 1
1 0 0 1 1 0
1 1 1 1 0 0
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 src1,  OutputArray dst, 
		 		 InputArray mask = noArray());

'컴퓨터 비전' 카테고리의 다른 글

OpenCV 주요 기능  (0) 2020.02.14
OpenCV 주요 클래스  (0) 2020.02.12
openCV를 사용한 영상의 밝기와 명암비 조절  (1) 2020.02.09

댓글