이진 이미지란 무엇인가?
이진 이미지(Binary Image)는 검정과 흰색, 단 두 가지 색상만으로 표현되는 디지털 이미지입니다. 이미지 처리 관점에서 보면 이진 이미지의 각 픽셀은 0과 1이라는 두 가지 값만 가질 수 있습니다. 픽셀 값이 0이면 순수한 검정색을, 1이면 순수한 흰색을 의미합니다.
그레이스케일 이미지의 각 픽셀은 256가지 서로 다른 값을 가질 수 있는 반면, 이진 이미지는 오직 두 가지 값만 가집니다. 이진 이미지는 다양한 분야에서 활용됩니다. 예를 들어 모폴로지 변환(morphological transformation)에는 이진 이미지가 필요하며, 배경으로부터 객체의 형태를 추출할 때도 이진 이미지가 사용됩니다. OpenCV를 사용하면 이미지를 자유롭게 이진 이미지로 변환할 수 있습니다.
1단계: 그레이스케일 이미지로 변환
다음 예제는 'original_image' 행렬에 불러온 이미지를 그레이스케일 이미지로 변환한 뒤 'grayscale_image' 행렬에 저장하는 코드입니다.
cvtColor(original_image, grayscale_image, COLOR_BGR2GRAY);
2단계: 이진 이미지로 변환
다음 코드는 그레이스케일 이미지를 이진 이미지로 변환하여 'binary_image' 행렬에 저장합니다.
threshold(grayscale_image, binary_image, 100, 255, THRESH_BINARY);
여기서 'grayscale_image'는 입력(source) 행렬이고, 'binary_image'는 출력(destination) 행렬입니다. 그 뒤에 오는 100과 255는 임계값(threshold) 범위를 나타내며, 어떤 그레이스케일 픽셀 값들을 변환할지 결정하는 기준이 됩니다. 이 설정에서는 픽셀 값이 100보다 크면 255(흰색)로, 100 이하이면 0(검정)으로 변환됩니다.
전체 예제 코드
다음 프로그램은 이미지를 불러온 후 이진 이미지로 변환하여 화면에 출력합니다.
Example
#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;// 이진 이미지를 저장할 행렬 선언
namedWindow("Original Image");// 원본 이미지를 보여줄 창 선언//
namedWindow("Show Binary");// 이진 이미지를 보여줄 창 선언//
original_image = imread("teddy.jpg");// 이미지를 행렬에 불러오기//
cvtColor(original_image, grayscale_image, COLOR_BGR2GRAY);// BGR을 그레이스케일로 변환하여 행렬에 저장//
threshold(grayscale_image, binary_image, 100, 255, THRESH_BINARY);// 그레이스케일 이미지를 이진 이미지로 변환//
imshow("Original Image", original_image);// 원본 이미지 출력//
imshow("Show Binary", binary_image);// 이진 이미지 출력//
waitKey(0);
return 0;
}Output
