OpenCV에서는 subtract() 함수를 통해 두 영상의 뺄셈 연산을 수행할 수 있습니다. subtract() 함수의 인자 구성과 설명은 add() 함수와 동일합니다.
void subtract(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray(), int dtype = -1); |
|
• src1 |
첫 번째 입력 행렬 또는 스칼라 |
• src2 |
두 번째 입력 행렬 또는 스칼라 |
• dst |
입력 행렬과 같은 크기, 같은 채널 수를 갖는 출력 행렬. dst의 깊이는 src1, src2의 깊이와 같거나 또는 dtype 인자에 의해 결정됩니다. |
• mask |
8비트 1채널 마스크 영상. mask 행렬 원소 값이 0이 아닌 위치에서만 덧셈 연산을 수행합니다. |
• dtype |
출력 행렬의 깊이. src1과 src2의 깊이가 같은 경우에는 dtype에 -1을 지정할 수 있고, 이 경우 dst의 깊이는 src1, src2와 같은 깊이로 설정됩니다. src1과 src2의 깊이가 서로 다른 경우에는 dtype을 반드시 지정해야 합니다. |
만약 뺄셈 연산의 두 입력 영상 타입이 같다면 subtract() 함수 대신 - 연산자 재정의를 사용할 수 있습니다. 그러나 서로 타입이 다른 두 영상끼리 뺄셈 연산을 수행하려면 반드시 subtract() 함수를 사용해야 하고, dtype 인자를 명시해야 합니다.
덧셈 연산과 달리 뺄셈 연산은 뺄셈의 대상이 되는 영상 순서에 따라 결과가 달라집니다. 그림 6-3은 lenna.bmp 영상과 hole2.bmp 영상의 뺄셈 연산 순서에 따른 결과 차이를 보여 줍니다. hole2.bmp 영상은 가운데 영역이 0에 가까운 검은색이고, 주변부로 갈수록 255에 가까운 흰색으로 바뀝니다. 그림 6-3(a)는 lenna.bmp 영상에서 hole2.bmp 영상을 뺀 결과입니다. 결과 영상의 가운데 영역은 레나 영상 얼굴 윤곽이 그대로 유지되어 나타나고, 주변부는 0에 가까운 검은색으로 채워진 것을 확인할 수 있습니다. 그림 6-3(b)는 hole2.bmp 영상에서 lenna.bmp 영상을 뺀 결과입니다. 이 경우에는 결과 영상 중앙부는 0에 가까운 검은색으로 나타나고 주변부는 레나 영상을 반전한 형태로 나타나는 것을 확인할 수 있습니다.