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: 이진화 방법

image



실습

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

image


  • 임계치 = 50

image