opencv c++ 임계값 처리(Threshold)로 이미지 이진화(Binary Image)
- 최초 작성일: 2022년 1월 11일(화)
목차
[TOC]
목표
이전에 봤던 노이즈 제거, GrayScaling은 모두 영상 처리 속도를 위한 작업들이었다. 빠른 처리 속도는 높은 정확도를 가지기 때문이다. 앞에서 설명했듯이 grayscale은 0~255 사이의 값을 저장하는 8bit 크기를 가진다. 이것을 2bit 크기로 바꿔준다면 속도가 빨라질 것이다.
그렇기 때문에 Binary Image를 만들어주는 것이다.
GrayScalling한 이미지에서 0~255 사이의 픽셀값을 임계값(Threshold) 기준으로 검정 혹은 흰색으로 처리하는 것이다.
이것을 이미지의 ‘이진화’라고 한다.
그러면 우선, Threshold 함수를 알아보자.
threshold(src, dst, threshold_value, max_value, threshold_type)
- src: 입력 이미지
- dst: 출력 이미지
- threshold_value: 임계치(0~255), 기준치
- max_value: 최대값 설정 (임계치 이상의 픽셀들에 적용할 값. 보통 255이지만, 그 이하도 가능)
- threshold_type: 이진화 방법
실습
Binary Image 생성에 대해 이해했다면, 이제 직접 코드를 실행해보면서 결과를 확인하고 비교해보자. 임계치 값을 바꿔보면서 결과를 비교해보자. 원한다면, threshold_type을 계속 바꿔보고, 바뀌는 결과를 비교해보자.
소스 코드
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int ac, char** av) {
Mat img = imread("lion.png", 0); //이미지를 grayscale로 불러옴
Mat img_threshold;
//threshold(img, img_threshold, 50, 255, THRESH_BINARY);
threshold(img, img_threshold, 150, 255, THRESH_BINARY);
imshow("original", img);
imshow("threshold", img_threshold);
waitKey(0);
return 0;
}
결과
실행 결과 아래의 이미지처럼 임계치 기준으로 어두운 부분은 검정, 밝은 부분은 흰색으로 2가지 색상으로만 표현되는 결과를 확인할 수 있다.
- 임계치 = 150
- 임계치 = 50