이진 이미지(binary image)를 반전(inversion)한다는 것은 이미지의 픽셀 값을 뒤집는 작업을 의미합니다. 시각적인 관점에서 보면, 이진 이미지를 반전하면 흰색 픽셀은 검은색으로, 검은색 픽셀은 흰색으로 서로 바뀌게 됩니다.
이 과정은 크게 세 단계로 진행됩니다. 먼저 컬러 이미지를 그레이스케일로 변환하고, 다음으로 임계값 처리(thresholding)를 통해 이진 이미지를 만든 후, 마지막으로 비트 연산 함수를 사용해 이미지를 반전합니다.
1단계: 컬러 이미지를 그레이스케일로 변환
이미지 반전 작업의 기반이 되는 함수의 기본 형태는 다음과 같습니다.
cvtColor(original_image, grayscale_image, COLOR_BGR2GRAY);
cvtColor() 함수는 BGR 형식의 원본 이미지를 그레이스케일 이미지로 변환하여 저장합니다.
2단계: 그레이스케일 이미지를 이진 이미지로 변환
다음 줄은 그레이스케일 이미지를 이진 이미지로 변환하고, 결과물을 'binary_image' 행렬에 저장합니다.
threshold(grayscale_image, binary_image, 100, 255, THRESH_BINARY);
여기서 'grayscale_image'는 소스(source) 행렬, 'binary_image'는 대상(destination) 행렬입니다. 그 뒤에 따라오는 두 숫자 100과 255는 임계값 범위를 나타냅니다. 즉, 어떤 그레이스케일 픽셀 값들을 기준으로 변환할지 결정하는 역할을 합니다.
3단계: bitwise_not() 함수로 이미지 반전
bitwise_not(source matrix, destination matrix);
bitwise_not() 함수는 소스 행렬의 픽셀 값을 비트 단위로 반전하여 대상 행렬에 저장합니다. 이 예제에서 소스 행렬은 'binary_image'이고, 대상 행렬은 'inverted_binary_image'입니다.
전체 예제 코드
다음 프로그램은 위에서 설명한 세 단계를 거쳐 이진 이미지 반전을 수행합니다.
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat original_image;//원본 이미지를 불러올 행렬 선언//
Mat grayscale_image;//변환된 이미지를 저장할 행렬 선언//
Mat binary_image;//이진 이미지를 저장할 행렬 선언//
Mat inverted_binary_image;//반전된 이진 이미지를 저장할 행렬 선언//
namedWindow("Binary Image");//이진 이미지를 표시할 윈도우 선언//
namedWindow("Inverted Binary Image");//반전된 이진 이미지를 표시할 윈도우 선언//
original_image = imread("mountain.jpg");//이미지를 행렬에 불러오기//
cvtColor(original_image, grayscale_image, COLOR_BGR2GRAY);//BGR 이미지를 그레이스케일로 변환하여 'grayscale_image' 행렬에 저장//
threshold(grayscale_image, binary_image, 100, 255, THRESH_BINARY);//그레이스케일 이미지를 이진 이미지로 변환//
bitwise_not(binary_image, inverted_binary_image);//이진 이미지를 반전하여 'inverted_binary_image' 행렬에 저장//
imshow("Binary Image", binary_image);//이진 이미지 출력//
imshow("Inverted Binary Image", inverted_binary_image);//반전된 이진 이미지 출력//
waitKey(0);
return 0;
}실행 결과
프로그램을 실행하면 원본 이진 이미지와 픽셀이 반전된 이진 이미지가 각각 별도의 창에 표시됩니다. 아래 결과 이미지에서 확인할 수 있듯이, 원래 흰색이던 영역은 검은색으로, 검은색이던 영역은 흰색으로 바뀐 것을 볼 수 있습니다.

정리
OpenCV에서 이진 이미지를 반전하는 핵심은 bitwise_not() 함수입니다. 실무에서는 문서 스캔 이미지 처리, 객체 검출 전처리, 마스크(mask) 연산 등 다양한 컴퓨터 비전 작업에서 이 반전 기법이 자주 활용되므로, 그레이스케일 변환과 임계값 처리 과정과 함께 확실히 익혀두는 것이 좋습니다.