Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++와 OpenCV로 이진 이미지 반전하는 방법 완벽 가이드

이진 이미지(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) 행렬입니다. 그 뒤에 따라오는 두 숫자 100255는 임계값 범위를 나타냅니다. 즉, 어떤 그레이스케일 픽셀 값들을 기준으로 변환할지 결정하는 역할을 합니다.

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

실행 결과

프로그램을 실행하면 원본 이진 이미지와 픽셀이 반전된 이진 이미지가 각각 별도의 창에 표시됩니다. 아래 결과 이미지에서 확인할 수 있듯이, 원래 흰색이던 영역은 검은색으로, 검은색이던 영역은 흰색으로 바뀐 것을 볼 수 있습니다.

C++와 OpenCV로 이진 이미지 반전하는 방법 완벽 가이드

정리

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